錯誤處理機制修改
一、現在有兩個異常類:Exception and Error.
PHP7現在有兩個異常類,Exception and Error。這兩個類別都實作了一個新的介面:Throwable。在您的異常處理程式碼中,類型暗示可能需要調整下。
二、一些致命錯誤和可恢復致命錯誤改為拋出Error物件。
有一些致命錯誤和可恢復致命錯誤現在改為報出Error物件。 Error物件是和Exception獨立的,它們無法被常規的try/catch撲獲。編按:需註冊錯誤處理函數,請參考下面的RFC。
對於這些已經轉為異常的可恢復致命錯誤,已經無法透過error handler靜默的忽略掉。尤其是無法忽略類型暗示錯誤。
三、語法錯誤會拋出一個ParseError物件
語法錯誤會拋出一個ParseError對象,該物件繼承自Error物件。之前處理eval()的時候,對於潛在可能錯誤的程式碼除了檢查回傳值或error_get_last()之外,還應該捕獲ParseError物件。
四、內部物件的建構方法如果失敗的時候總是會拋出異常
內部物件的建構方法如果失敗的時候總是會報出異常。之前的有一些建構方法會回傳NULL或一個無法使用的物件。
五、一些E_STRICT錯誤的等級調整了。
PHP 7 錯誤處理
##PHP 7 改變了大多數錯誤的報告方式。不同於 PHP 5 的傳統錯誤回報機制,現在大多數錯誤都被當作 Error 異常拋出。 這種 Error 異常可以像普通異常一樣被 try / catch 區塊所捕捉。如果沒有符合的 try / catch 區塊, 則呼叫異常處理函數(由 set_exception_handler() 註冊)進行處理。 如果尚未註冊異常處理函數,則按照傳統方式處理:被報告為一個致命錯誤(Fatal Error)。 Error 類別並不是從 Exception 類別 擴展出來的,所以用 catch (Exception $e) { ... } 這樣的程式碼是捕獲不 到 Error 的。你可以用 catch (Error $e) { ... } 這樣的程式碼,或是透過註冊異常處理函數( set_exception_handler())來捕捉 Error。
Error 異常層次結構
##1 .Error
- ArithmeticError
...
」實例
<?php class MathOperations { protected $n = 10; // 求余数运算,除数为 0,抛出异常 public function doOperation(): string { try { $value = $this->n % 0; return $value; } catch (DivisionByZeroError $e) { return $e->getMessage(); } } } $mathOperationsObj = new MathOperations(); print($mathOperationsObj->doOperation()); ?>
以上程式執行輸出結果為:
Modulo by zero
PHP 7 異常
assert() 配置 |
| |
#1 - 產生和執行程式碼(開發模式) |
|
參數
assertion
#斷言。在 PHP 5 中,是一個用於執行的字串或用於測試的布林值。在 PHP 7 中,可以是一個傳回任何值的表達式, 它將被執行結果用來指明斷言是否成功。
description
如果 assertion 失敗了,選項 description 將會包含在失敗訊息裡。
exception
在 PHP 7 中,第二個參數可以是一個 Throwable 對象,而不是字串,如果斷言失敗且啟用了 assert.exception 該物件將被拋出。
實例
將zend.assertions 設為0:
<?php ini_set('zend.assertions', 0); assert(true == false); echo 'Hi!'; ?>
以上程式執行輸出結果為:
Hi!
將zend.assertions 設為1,assert.exception 設為1:
實例
<?php ini_set('zend.assertions', 1); ini_set('assert.exception', 1); assert(true == false); echo 'Hi!'; ?>
#以上程式執行輸出結果為:
Fatal error: Uncaught AssertionError: assert(true == false) in -:2Stack trace:#0 -(2): assert(false, 'assert(true == ...')#1 {main} thrown in - on line 2