İstisnaları Genişletmek

Yerleşik Exception sınıfını genişleten kullanıcı tanımlı bir istisna sınıfı tanımlanabilir. Aşağıdaki üyeler ve özellikler, yerleşik Exception sınıfından türetilen alt sınıf içerisinde nelerin erişilebilir olduğunu göstermektedir.

Örnek 1 - Yerleşik Exception sınıfı

<?php
class Exception extends Throwable
{
    protected 
$message 'Bilinmeyen istisna';  // istisna iletisi
    
private   $string;                          // __toString önbelleği
    
protected $code 0;                     // kullanıcı tanımlı istisna kodu
    
protected $file;                         // istisnanın kaynak dosyası
    
protected $line;                  // istisnanın kaynak dosyasındaki satırı
    
private   $trace;                           // geriye doğru hata izleme
    
private   $previous;              // istisnalar iç içe ise önceki istisna



    
public function __construct($message null$code 0,
                                  
Exception $previous null);


    final private function 
__clone();           // İstisna kopyalamayı engeller
    
final public function getMessage();         // istisna iletisi
    
final public function getCode();            // istisnanın kodu
    
final public function getFile();            // kaynak dosya
    
final public function getLine();            // kaynak dosya satırı
    
final public function getTrace();           // backtrace() dizisi
    
final public function getTraceAsString();   // biçemli hata izleme dizgesi
    
final public  function getPrevious();       // önceki istisna

    // Geçersiz kılınabilir //
    
public function __toString();  // görüntüleme için biçemlenmiş dizge
}
?>

Bir sınıf yerleşik Exception sınıfını genişletiyor ve nesne kurucuyu yeniden tanımlıyorsa, mevcut tüm verinin düzgün biçimde atandığından emin olmak için parent::__construct() işlevinin de çağrılması hararetle önerilir. Nesne bir karakter dizisi olarak sunulduğunda özelleştirilmiş bir çıktı sağlayabilmek için __toString() yöntemi geçersiz kılınabilir.

Bilginize:

İstisnaların kopyaları yapılamaz. Bir istisnanın kopyasını yapmaya çalışmak ölümcül hatayla (E_FATAL seviyesinden bir hata) ile sonuçlanır.

Örnek 2 - Exception sınıfının genişletilmesi (PHP 5.3.0+)

<?php
/**
 * Özelleştirilmiş bir istisna sınıfı tanımlayalım
 */
class MyException extends Exception
{
    
// İstisnayı yeniden tanımlayalım, böylece ileti seçimlik olmaktan çıkar
    
public function __construct($message$code 0,
                                
Exception $previous null) {
        
// biraz kod

        // her şeyin düzgün atandığından emin olalım
        
parent::__construct($message$code$previous);
    }

    
// nesnenin özelleştirilmiş karakter dizisi gösterimi
    
public function __toString() {
        return 
__CLASS__ ": [{$this->code}]: {$this->message}\n";
    }

    public function 
customFunction() {
        echo 
"Bu türdeki istisnalar için özelleştirilmiş işlev\n";
    }
}


/**
 * İstisnayı denemek için bir sınıf oluşturalım
 */
class TestException
{
    public 
$var;

    const 
THROW_NONE    0;
    const 
THROW_CUSTOM  1;
    const 
THROW_DEFAULT 2;

    function 
__construct($avalue self::THROW_NONE) {

        switch (
$avalue) {
            case 
self::THROW_CUSTOM:
                
// özelleştirilmiş istisna oluştur
                
throw new MyException('1 geçersiz bir değiştirgedir'5);
                break;

            case 
self::THROW_DEFAULT:
                
// öntanımlı olarak bir oluşturulur.
                
throw new Exception('2 geçerli bir değiştirge değildir'6);
                break;

            default:
                
// İstisna yok; nesne oluşturulacak.
                
$this->var $avalue;
                break;
        }
    }
}


// Örnek 1
try {
    
$o = new TestException(TestException::THROW_CUSTOM);
} catch (
MyException $e) {      // Yakalanacaktır
    
echo "Benim istisnam yakalandı\n"$e;
    
$e->customFunction();
} catch (
Exception $e) {        // Bu atlanır
    
echo "Öntanımlı istisna yakalandı\n"$e;
}

// Çalışmaya devam et
var_dump($o);  // Null
echo "\n\n";


// Örnek 2
try {
    
$o = new TestException(TestException::THROW_DEFAULT);
} catch (
MyException $e) {      // Bu tür ile uyuşmuyor
    
echo "Benim istisnam yakalandı\n"$e;
    
$e->customFunction();
} catch (
Exception $e) {        // Bu yakalanacaktır
    
echo "Öntanımlı istisna yakalandı\n"$e;
}

// Çalışmaya devam et
var_dump($o);  // Null
echo "\n\n";


// Örnek 3
try {
    
$o = new TestException(TestException::THROW_CUSTOM);
} catch (
Exception $e) {        // Yakalanacaktır
    
echo "Öntanımlı İstisna yakalandı\n"$e;
}

// Çalışmaya devam et
var_dump($o);  // Null
echo "\n\n";


// Örnek 4
try {
    
$o = new TestException();
} catch (
Exception $e) {        // Bu atlandır; istisna yok
    
echo "Öntanımlı İstisna yakalandı\n"$e;
}

// Çalışmaya devam et
var_dump($o); // TestException
echo "\n\n";
?>

Bilginize:

Versions of PHP 5, prior to PHP 5.3.0'dan önceki PHP 5 sürümleri iç içe istisnaları desteklemez. Aşağıdaki kod parçası bu örneği çalıştırmak isterseniz MyException sınıfının yerine kullanılabilir.

<?php
/**
 * İstisnayı denemek için bir sınıf oluşturalım
 */
class MyException extends Exception
{
    
// İstisnayı yeniden tanımlayalım, böylece ileti seçimlik olmaktan çıkar
    
public function __construct($message$code 0) {
        
// some code

        // Herşeyin düzgün olarak atandığından emin olalım
        
parent::__construct($message$code);
    }

    
// Nesnenin özel dizge gösterimi
    
public function __toString() {
        return 
__CLASS__ ": [{$this->code}]: {$this->message}\n";
    }

    public function 
customFunction() {
        echo 
"İstisnanın bu türü için özel işlev\n";
    }
}
?>