2017-10-09 44 views
2

奇怪的是,我使用類似於基類Exception類的相同接口創建了一個類,但不能擴展/派生它。只是普通的PHP對象就像一個異常。我知道這不會像解釋here一樣工作,但是因爲所有異常都像普通類一樣,所以無論如何都試過。PHP,例外與常規類有什麼不同

class MyException { 

/** 
* properties omitted 
*/ 

public function __construct(string $message = "",int $code) 

public function getMessage(void) 

//more methods 
} 

// somewhere in code block 

    throw new MyException("Fatal error"); 
    // Fatal error: exceptions must be valid objects derived from exception base class. 

您能否介紹一下其他方式,例外情況與常規類不同,以及它們如何在我們的代碼中實現其例外作用。我知道這可能是一個愚蠢的問題,但我只是希望更多地瞭解異常是如何工作的。

+1

只能拋出[throwables](http://php.net/manual/en/class.throwable.php)。沒有任何課程。這只是一種語言規則。 – apokryfos

回答

2

例外是普通類。它必須擴展'Exception',因爲PHP不想檢查它是否具有所有必需的方法/屬性(由默認的PHP異常處理程序使用)。

通過擴展類(或實現接口),你可以證明你的類有類似'getMessage()'的方法,它不會拋出關於不存在的方法的錯誤。

它必須實現所有的Throwable接口方法(http://php.net/manual/en/class.throwable.php):

Throwable { 
    /* Methods */ 
    abstract public string getMessage (void) 
    abstract public int getCode (void) 
    abstract public string getFile (void) 
    abstract public int getLine (void) 
    abstract public array getTrace (void) 
    abstract public string getTraceAsString (void) 
    abstract public Throwable getPrevious (void) 
    abstract public string __toString (void) 
} 
1

Exception類只是容器程序員使用來傳遞有關異常的(信息的錯誤代碼,消息,位置,棧跟蹤,可能對處理異常有用的其他信息)從程序的一部分(發生異常的地方)到程序的其他部分(有代碼知道如何處理它)。

它的構造函數只不過是將其接收的值存儲爲參數。其他方法只是getter;它們用於從Exception對象中提取值。 Exception類不實現任何行爲。

除了要求延長Exception之外,沒有什麼特別的。

+0

這是否表明異常被PHP在解析時識別爲特殊而不僅僅是一個類 –

相關問題