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