İ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 implements 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 = '', $code = 0,
                                  Throwable $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
/**
* Ö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,
                                Throwable $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 bağımsız değişkendir', 5);
                break;

            case self::THROW_DEFAULT:
                // öntanımlı olarak bir oluşturulur.
                throw new Exception('2 geçerli bir bağımsız değişken 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";
?>