downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Gönderimlerle İlgili Herşey> <İstisnalar
[edit] Last updated: Fri, 23 Mar 2012

view this page in

İ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
{
    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
/**
 * Ö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";
?>


Gönderimlerle İlgili Herşey> <İstisnalar
[edit] Last updated: Fri, 23 Mar 2012
 
add a note add a note User Contributed Notes İstisnaları Genişletmek
Dor 15-Oct-2011 02:30
It's important to note that subclasses of the Exception class will be caught by the default Exception handler

<?php
   
   
/**
     * NewException
     * Extends the Exception class so that the $message parameter is now mendatory.
     *
     */
   
class NewException extends Exception {
       
//$message is now not optional, just for the extension.
       
public function __construct($message, $code = 0, Exception $previous = null) {
           
parent::__construct($message, $code, $previous);
        }
    }
   
   
/**
     * TestException
     * Tests and throws Exceptions.
     */
   
class TestException {
        const
NONE = 0;
        const
NORMAL = 1;
        const
CUSTOM = 2;
        public function
__construct($type = self::NONE) {
            switch (
$type) {
                case
1:
                    throw new
Exception('Normal Exception');
                    break;
                case
2:
                    throw new
NewException('Custom Exception');
                    break;
                default:
                    return
0; //No exception is thrown.
           
}
        }
    }
   
    try {
       
$t = new TestException(TestException::CUSTOM);
    }
    catch (
Exception $e) {
       
print_r($e); //Exception Caught
   
}
   
?>

Note that if an Exception is caught once, it won't be caught again (even for a more specific handler).
joechrz at gmail dot com 18-Feb-2010 03:18
It's important to note some unexpected behavior when overriding the __toString method of an Exception.  The default PHP exception handler will truncate the result of the __toString method to the number of bytes specified by log_errors_max_len in php.ini. 

To get around this problem, you need to either change the value of log_errors_max_len:

<?php
   
// recommended: disable error logging
    // so the log files don't become bloated from huge
    // exception strings
   
ini_set('log_errors','off');

   
// log_errors_max_len = infinite length
   
ini_set("log_errors_max_len",0);
?>

or specify a custom exception handler:
<?php
   
function long_exception_handler($exception) {
       
// for compatibility, call __toString
       
echo $exception->__toString();
    }
   
set_exception_handler('long_exception_handler');
?>
iamhiddensomewhere at gmail dot com 31-Dec-2009 03:17
As previously noted exception linking was recently added (and what a god-send it is, it certainly makes layer abstraction (and, by association, exception tracking) easier).

Since <5.3 was lacking this useful feature I took some initiative and creating a custom exception class that all of my exceptions inherit from:

<?php

class SystemException extends Exception
{
    private
$previous;
   
    public function
__construct($message, $code = 0, Exception $previous = null)
    {
       
parent::__construct($message, $code);
       
        if (!
is_null($previous))
        {
           
$this -> previous = $previous;
        }
    }
   
    public function
getPrevious()
    {
        return
$this -> previous;
    }
}

?>

Hope you find it useful.
sapphirepaw.org 24-Nov-2009 07:37
Support for exception linking was added in PHP 5.3.0. The getPrevious() method and the $previous argument to the constructor are not available on any built-in exceptions in older versions of PHP.
paragdiwan at gmail dot com 17-Jan-2009 01:32
I have written similar simple custom exception class. Helpful for newbie.
<?php
   
/*
        This is written for overriding the exceptions.
        custom exception class
    */
   
error_reporting(E_ALL-E_NOTICE);
    class
myCustomException extends Exception
   
{
       
        public function
__construct($message, $code=0)
        {
           
parent::__construct($message,$code);
        }   

        public function
__toString()
        {
            return
"<b style='color:red'>".$this->message."</b>";
        }
       
       
    }

    class
testException
   
{
       
        public function
__construct($x)
        {
       
           
$this->x=$x;
           
        }
       
        function
see()
        {
           

            if(
$this->x==9 )
            {
                throw new
myCustomException("i didnt like it");
            }
        }
    }

   
$obj = new testException(9);
    try{
   
       
$obj->see();
    }
    catch(
myCustomException $e)
    {
        echo
$e;
    }
?>

 
show source | credits | stats | sitemap | contact | advertising | mirror sites