锟斤拷展锟斤拷extend锟斤拷 PHP 锟斤拷锟矫碉拷锟届常锟斤拷锟斤拷锟斤拷

锟矫伙拷锟斤拷锟斤拷锟斤拷锟皆讹拷锟斤拷锟斤拷斐o拷锟斤拷锟斤拷锟斤拷锟斤拷锟秸� PHP 锟斤拷锟矫碉拷锟届常锟斤拷锟斤拷锟洁。锟斤拷锟铰的达拷锟斤拷说锟斤拷锟斤拷锟斤拷锟斤拷锟矫碉拷锟届常锟斤拷锟斤拷锟斤拷锟叫o拷锟斤拷些锟斤拷锟皆和凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟角可凤拷锟绞和可继承的★拷锟斤拷锟斤拷注锟斤拷锟斤拷锟斤拷锟斤拷未锟斤拷锟街晃碉拷锟斤拷锟斤拷锟斤拷斐o拷锟斤拷锟斤拷锟侥结构锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷一锟斤拷锟斤拷实锟斤拷锟斤拷锟斤拷目锟斤拷么锟斤拷搿�

Example #1 锟斤拷锟矫碉拷锟届常锟斤拷锟斤拷锟斤拷

<?php
class Exception
{
    protected 
$message 'Unknown exception';   // 锟届常锟斤拷息
    
private   $string;                          // __toString cache
    
protected $code 0;                        // 锟矫伙拷锟皆讹拷锟斤拷锟届常锟斤拷锟斤拷
    
protected $file;                            // 锟斤拷锟斤拷锟届常锟斤拷锟侥硷拷锟斤拷
    
protected $line;                            // 锟斤拷锟斤拷锟届常锟侥达拷锟斤拷锟叫猴拷
    
private   $trace;                           // backtrace
    
private   $previous;                        // previous exception if nested exception

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

    final private function 
__clone();           // Inhibits cloning of exceptions.

    
final public  function getMessage();        // 锟斤拷锟斤拷锟届常锟斤拷息
    
final public  function getCode();           // 锟斤拷锟斤拷锟届常锟斤拷锟斤拷
    
final public  function getFile();           // 锟斤拷锟截凤拷锟斤拷锟届常锟斤拷锟侥硷拷锟斤拷
    
final public  function getLine();           // 锟斤拷锟截凤拷锟斤拷锟届常锟侥达拷锟斤拷锟叫猴拷
    
final public  function getTrace();          // backtrace() 锟斤拷锟斤拷
    
final public  function getPrevious();       // 之前锟斤拷 exception
    
final public  function getTraceAsString();  // 锟窖革拷苫锟斤拷锟斤拷址锟斤拷锟斤拷锟� getTrace() 锟斤拷息

    // Overrideable
    
public function __toString();               // 锟斤拷锟斤拷锟斤拷锟斤拷址锟斤拷锟�
}
?>

锟斤拷锟绞癸拷锟斤拷远锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷展锟斤拷锟斤拷锟届常锟斤拷锟斤拷锟洁,锟斤拷锟斤拷要锟斤拷锟铰讹拷锟斤拷锟斤拷锟届函锟斤拷锟侥伙拷锟斤拷锟斤拷锟斤拷同时锟斤拷锟斤拷 parent::__construct() 锟斤拷锟斤拷锟斤拷锟斤拷械谋锟斤拷锟斤拷欠锟斤拷驯锟斤拷锟街碉拷锟斤拷锟斤拷锟斤拷锟揭拷锟斤拷锟街凤拷锟斤拷锟斤拷时锟津,匡拷锟斤拷锟斤拷锟斤拷 __toString() 锟斤拷锟皆讹拷锟斤拷锟斤拷锟斤拷锟斤拷锟绞斤拷锟�

Note:

Exception 锟斤拷锟斤拷锟杰憋拷锟斤拷锟狡★拷锟斤拷锟皆讹拷 Exception 锟斤拷锟斤拷锟斤拷 锟结导锟斤拷一锟斤拷 E_ERROR 锟斤拷锟斤拷拇锟斤拷锟�

Example #2 锟斤拷展 PHP 锟斤拷锟矫碉拷锟届常锟斤拷锟斤拷锟斤拷 (PHP 5.3.0+)

<?php
/**
 * 锟皆讹拷锟斤拷一锟斤拷锟届常锟斤拷锟斤拷锟斤拷
 */
class MyException extends Exception
{
    
// 锟截讹拷锟藉构锟斤拷锟斤拷使 message 锟斤拷为锟斤拷锟诫被指锟斤拷锟斤拷锟斤拷锟斤拷
    
public function __construct($message$code 0Exception $previous null) {
        
// 锟皆讹拷锟斤拷拇锟斤拷锟�

        // 确锟斤拷锟斤拷锟叫憋拷锟斤拷锟斤拷锟斤拷锟斤拷确锟斤拷值
        
parent::__construct($message$code$previous);
    }

    
// 锟皆讹拷锟斤拷锟街凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟绞�
    
public function __toString() {
        return 
__CLASS__ ": [{$this->code}]: {$this->message}\n";
    }

    public function 
customFunction() {
        echo 
"A custom function for this type of exception\n";
    }
}


/**
 * 锟斤拷锟斤拷一锟斤拷锟斤拷锟节诧拷锟斤拷锟届常锟斤拷锟斤拷锟斤拷频锟斤拷锟�
 */
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:
                
// 锟阶筹拷锟皆讹拷锟斤拷锟届常
                
throw new MyException('1 is an invalid parameter'5);
                break;

            case 
self::THROW_DEFAULT:
                
// 锟阶筹拷默锟较碉拷锟届常
                
throw new Exception('2 is not allowed as a parameter'6);
                break;

            default: 
                
// 没锟斤拷锟届常锟斤拷锟斤拷锟斤拷拢锟斤拷锟斤拷锟揭伙拷锟斤拷锟斤拷锟�
                
$this->var $avalue;
                break;
        }
    }
}


// 锟斤拷锟斤拷 1
try {
    
$o = new TestException(TestException::THROW_CUSTOM);
} catch (
MyException $e) {      // 锟斤拷锟斤拷锟届常
    
echo "Caught my exception\n"$e;
    
$e->customFunction();
} catch (
Exception $e) {        // 锟斤拷锟斤拷锟斤拷
    
echo "Caught Default Exception\n"$e;
}

// Continue execution
var_dump($o); // Null
echo "\n\n";


// 锟斤拷锟斤拷 2
try {
    
$o = new TestException(TestException::THROW_DEFAULT);
} catch (
MyException $e) {      //  锟斤拷锟斤拷匹锟斤拷锟届常锟斤拷锟斤拷锟洁,锟斤拷锟斤拷锟斤拷

    
echo "Caught my exception\n"$e;
    
$e->customFunction();
} catch (
Exception $e) {        // 锟斤拷锟斤拷锟届常
    
echo "Caught Default Exception\n"$e;
}

// 执锟叫猴拷锟斤拷锟斤拷锟斤拷
var_dump($o); // Null
echo "\n\n";


// 锟斤拷锟斤拷 3
try {
    
$o = new TestException(TestException::THROW_CUSTOM);
} catch (
Exception $e) {        // 锟斤拷锟斤拷锟届常
    
echo "Default Exception caught\n"$e;
}

// 执锟叫猴拷锟斤拷锟斤拷锟斤拷
var_dump($o); // Null
echo "\n\n";


// 锟斤拷锟斤拷 4
try {
    
$o = new TestException();
} catch (
Exception $e) {        // 没锟斤拷锟届常锟斤拷锟斤拷锟斤拷锟斤拷
    
echo "Default Exception caught\n"$e;
}

// 执锟叫猴拷锟斤拷锟斤拷锟斤拷
var_dump($o); // TestException
echo "\n\n";
?>

Note:

Versions of PHP 5, prior to PHP 5.3.0 do not support nesting of exceptions. The following code fragment can be used as a replacement MyException class if you wish to run this example.

<?php
/**
 * Define a custom exception class
 */
class MyException extends Exception
{
    
// Redefine the exception so message isn't optional
    
public function __construct($message$code 0) {
        
// some code
    
        // make sure everything is assigned properly
        
parent::__construct($message$code);
    }

    
// custom string representation of object
    
public function __toString() {
        return 
__CLASS__ ": [{$this->code}]: {$this->message}\n";
    }

    public function 
customFunction() {
        echo 
"A custom function for this type of exception\n";
    }
}
?>