錯誤處理機制修改


一、現在有兩個異常類: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      

  • AssertionError      

  • DivisionByZeroError      

  • ParseError      

  • #TypeError

  • 2.Exception

...

1458887252-2773-exception-hiearchy.jpg

」實例

<?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 異常

#PHP 7 異常用於向下相容及增強舊的assert()函數。它能在生產環境中實現零成本的斷言,並且提供拋出自定義異常及錯誤的能力。 舊版的API出於相容目的將繼續被維護,assert()現在是一個語言結構,它允許第一個參數是一個表達式,而不僅僅是一個待計算的string或一個待測試的boolean。 assert() 配置assert.exception




    配置項目
  • 預設值
  • 可選值

  • zend.assertions
1
#1 - 產生和執行程式碼(開發模式)
    0 - 產生程式碼,但在執行時跳過它
  • -1 - 不產生程式碼(生產環境)
#0#################1 -斷言失敗時拋出,可以拋出異常對象,如果沒有提供異常,則拋出AssertionError 物件實例。 ############0 - 使用或產生Throwable, 只是基於物件產生的警告而不是拋出物件(與PHP 5 相容)############# ########

參數

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