��չ��extend�� PHP ���õ��쳣������

�û��������Զ�����쳣����������չ PHP ���õ��쳣�����ࡣ���µĴ���˵���������õ��쳣�������У���Щ���Ժͷ������������ǿɷ��ʺͿɼ̳еġ�����ע��������δ���ֻΪ˵�������쳣������Ľṹ����������һ����ʵ������Ŀ��ô��롣

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