<?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";
?>