摘要:上手并過渡到取代的泊學原文鏈接泊學代碼秀視頻自從以來,的錯誤處理幾乎就是一成不變的。在中,這個尷尬的現狀,終于被徹底改變了。無論是還是傳統的,只要類型不匹配約束的時候,就會導致異常。
上手并過渡到PHP7 取代fatal error的engine exceptions
泊學原文鏈接
泊學代碼秀視頻
自從PHP 4以來,PHP的錯誤處理幾乎就是一成不變的。只不過在PHP 5.0里添加了E_STRICT,在PHP 5.2里添加了E_RECOVERABLE_ERROR,在PHP 5.3里,添加了E_DPRECATED這幾種Error level。盡管PHP 5中加入了Exception,但PHP中只有很少的模塊使用了這個機制(例如:pdo和spl)。在PHP 7中,這個尷尬的現狀,終于被徹底改變了。
Engine ExceptionsPHP 7里,幾乎所有的Fatal和Catchable fatal error都被替換成了 Engine exceptions 。但是,所有未被catch的異常仍舊會導致一個“傳統”的PHP fatal error,因此,對于各種fatal error來說,這個改動幾乎是向前兼容的。但對于其他類型的Error(non-fatal)來說,由于它們也被轉換成了異常,忽略它們同樣會導致一個fatal error,因此,對這些錯誤的處理,并不向前兼容。
把各種錯誤統一成異常的一個好處,就是我們可以使用try...catch來統一處理它們,進而,為錯誤現場的正確清理提供諸多保障:
確保finally內的代碼被調用;
確保類的__destruct()函數被調用;
使用register_shutdown_function()注冊的回調函數被調用;
總之,因為有了engine exceptions,錯誤更不容易被忽略,也更容易被處理。我們來看一個例子: 構造函數中發生異常會怎么樣呢?
getMessage(); }
在PHP 5里,$msg會是一個null或不可用對象。在PHP 7里,MessageFormatter則會拋出一個IntlException異常:Constructor failed。
PHP 7 Exception架構為了能夠和PHP 5兼容,我們必須確保之前的call-all寫法:
getMessage(); }
不能捕獲新的PHP 7 engine exceptions(因為在PHP 7之前,Fatal error是不能夠被捕獲和處理的)。這樣,那些沒有被處理的異常,才會像之前一樣導致一個Fatal error。因此,所有新的engine exception并沒有繼承之前的Exception類,而是繼承了一個新的叫做Error的基類。
class Error implements Throwable { /* Inherited methods */ abstract public string Throwable::getMessage ( void ) abstract public int Throwable::getCode ( void ) ... }
基于Error exception,派生了5個新的engine exception:ArithmeticError / AssertionError / DivisionByZeroError / ParseError / TypeError。在PHP 7里,無論是老的Exception還是新的Error,它們都實現了一個共同的interface: Throwable。因此,Throwable是PHP 7異常架構里最頂層的接口。所以,如果你想在PHP 7里實現一個catch-all,你可以這樣:
getMessage(); }Error exception
接下來,我們來分別了解一下新增的這幾個engine exception:
Error
這個異常代表了PHP 7中標準的fatal和catchable-fatal錯誤,如果它不被catch,就會進而觸發一個“傳統”的PHP fatal error。例如,我們調用一個不存在的方法:
try { nonExistFunc(); } catch(Error $e) { echo "Error catch: ".$e->getMessage(); }AssertionError
如果你在php.ini里,把assert.exception設置成1,當斷言失敗的時候,你就會收到這個異常:
try { assert("1 > 2", "1 > 2, are your serious?"); } catch(AssertionError $e) { echo $e->getMessage(); }
“如果我們在assert()里不設置錯誤信息,AssertError讀不到錯誤信息的。”
最佳實踐
ArithmeticError和算數運算有關。運算發生越界或者bit shift負數位數,都會導致發生ArithmeticError。例如下面這段代碼就會導致“Bit shift by negative number”錯誤。
try { 1 >> -1; } catch(ArithmeticError $e) { echo $e->getMessage(); }
而DivisionByZeroError則表示除數為0而導致的錯誤(無論我們使用 / % 或 intdiv(),只要除數為0,都會導致這個錯誤)。
TypeError我們在前面的視頻介紹過PHP 7的scalar type hints以及strict mode。無論是scalar type hints還是傳統的type hints(class / interface / callable / array),只要類型不匹配type hints約束的時候,就會導致TypeErro異常。
try { 1 >> -1; } catch(ArithmeticError $e) { echo $e->getMessage(); }set_error_handler()
在PHP 7里,有一點是和PHP 5不兼容的,如果我們之前使用set_error_handler()處理catchable fatal error,在PHP 7里,這些error已經變成了engine exception,它們不會再被set_error_handler()處理。
自定義異常盡管Throwable是PHP 7中的頂層異常接口,但當我們自定義異常的時候,卻不能直接實現它。否則PHP會提示我們下面的錯誤:
class MyException implements Throwable {}
Fatal error: Class MyException cannot implement interface Throwable, extend Exception or Error instead
為了能正確處理異常行號、文件名和stack trace,我們只能從Exception或者Error派生自己的異常類。但是,我們可以拓展新的Throwable接口,并且實現其中的方法:
interface MyExceptionInterface extends Throwable { } class MyError extends Error implements MyExceptionInterface { }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21292.html
摘要:截止到目前為止,官方已經發布了的版本,距離發布第一個正式版本不會很遠了現在來說的重大特性肯定已經是定型了,不會再有什么變動了。 截止到目前為止,PHP官方已經發布了php7的RC7版本,距離發布第一個正式版本不會很遠了!現在來說php7的重大特性肯定已經是定型了,不會再有什么變動了。后續一些版本的迭代主要也就是修修bug,優化之類的。下面就來說話我們一直期待的php7會有那些主要的變化...
先上代碼 ECHO PHP_VERSION.PHP_EOL; function add (int $left,int $right){ return $left+$right; } try { echo add(left, right); } catch (Exception $e) { // Handle exception } catch (Error $e) { //...
摘要:版本發布在即,本文整理一下中的一些新特性以供了解。所有內容均選自官方文檔。可空類型可空類型主要用于參數類型聲明和函數返回值聲明。主要的兩種形式如下從例子很容易理解,所指的就是通過的形式表明函數參數或者返回值的類型要么為指定類型,要么為。 PHP 7.1 release版本發布在即,本文整理一下 7.1 中的一些新特性以供了解。所有內容均選自官方 RFC 文檔。 可空類型 可空類型主要用...
摘要:輕量級集合迭代器泊學視頻鏈接泊閱文檔鏈接是加入的新語言特性。接下來,我們可以像訪問一個普通集合一樣使用現在重新執行我們的文件,就不會再報錯了。簡單來說,就是一個輕量級的,可以記住自身狀態的集合迭代器。 輕量級集合迭代器-Generator泊學視頻鏈接泊閱文檔鏈接Generator是PHP 5.5加入的新語言特性。但是,它似乎并沒有被很多PHP開發者廣泛采用。因此,在我們了解PHP 7對...
閱讀 1399·2021-09-02 09:53
閱讀 2667·2021-07-29 13:50
閱讀 1715·2019-08-30 11:07
閱讀 1571·2019-08-30 11:00
閱讀 1450·2019-08-29 14:00
閱讀 1844·2019-08-29 12:52
閱讀 2560·2019-08-29 11:11
閱讀 3415·2019-08-26 12:23