成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

上手并過渡到PHP7(4)——取代fatal error的engine exceptions

mylxsw / 3165人閱讀

摘要:上手并過渡到取代的泊學(xué)原文鏈接泊學(xué)代碼秀視頻自從以來,的錯誤處理幾乎就是一成不變的。在中,這個尷尬的現(xiàn)狀,終于被徹底改變了。無論是還是傳統(tǒng)的,只要類型不匹配約束的時候,就會導(dǎo)致異常。

上手并過渡到PHP7 取代fatal error的engine exceptions

泊學(xué)原文鏈接
泊學(xué)代碼秀視頻

自從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中只有很少的模塊使用了這個機(jī)制(例如:pdo和spl)。在PHP 7中,這個尷尬的現(xiàn)狀,終于被徹底改變了。

Engine Exceptions

PHP 7里,幾乎所有的Fatal和Catchable fatal error都被替換成了 Engine exceptions 。但是,所有未被catch的異常仍舊會導(dǎo)致一個“傳統(tǒng)”的PHP fatal error,因此,對于各種fatal error來說,這個改動幾乎是向前兼容的。但對于其他類型的Error(non-fatal)來說,由于它們也被轉(zhuǎn)換成了異常,忽略它們同樣會導(dǎo)致一個fatal error,因此,對這些錯誤的處理,并不向前兼容。

把各種錯誤統(tǒng)一成異常的一個好處,就是我們可以使用try...catch來統(tǒng)一處理它們,進(jìn)而,為錯誤現(xiàn)場的正確清理提供諸多保障:

確保finally內(nèi)的代碼被調(diào)用;

確保類的__destruct()函數(shù)被調(diào)用;

使用register_shutdown_function()注冊的回調(diào)函數(shù)被調(diào)用;

總之,因為有了engine exceptions,錯誤更不容易被忽略,也更容易被處理。我們來看一個例子: 構(gòu)造函數(shù)中發(fā)生異常會怎么樣呢?

getMessage();
}

在PHP 5里,$msg會是一個null或不可用對象。在PHP 7里,MessageFormatter則會拋出一個IntlException異常:Constructor failed。

PHP 7 Exception架構(gòu)

為了能夠和PHP 5兼容,我們必須確保之前的call-all寫法:

getMessage();
}

不能捕獲新的PHP 7 engine exceptions(因為在PHP 7之前,F(xiàn)atal error是不能夠被捕獲和處理的)。這樣,那些沒有被處理的異常,才會像之前一樣導(dǎo)致一個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,它們都實(shí)現(xiàn)了一個共同的interface: Throwable。因此,Throwable是PHP 7異常架構(gòu)里最頂層的接口。所以,如果你想在PHP 7里實(shí)現(xiàn)一個catch-all,你可以這樣:

getMessage();
}
Error exception

接下來,我們來分別了解一下新增的這幾個engine exception:

Error

這個異常代表了PHP 7中標(biāo)準(zhǔn)的fatal和catchable-fatal錯誤,如果它不被catch,就會進(jìn)而觸發(fā)一個“傳統(tǒng)”的PHP fatal error。例如,我們調(diào)用一個不存在的方法:

try {
    nonExistFunc();
}
catch(Error $e) {
    echo "Error catch: ".$e->getMessage();
}
AssertionError

如果你在php.ini里,把a(bǔ)ssert.exception設(shè)置成1,當(dāng)斷言失敗的時候,你就會收到這個異常:

try {
    assert("1 > 2", "1 > 2, are your serious?");
}
catch(AssertionError $e) {
    echo $e->getMessage();
}

“如果我們在assert()里不設(shè)置錯誤信息,AssertError讀不到錯誤信息的?!?br>最佳實(shí)踐

ArithmeticError and DivisionByZeroError

ArithmeticError和算數(shù)運(yùn)算有關(guān)。運(yùn)算發(fā)生越界或者bit shift負(fù)數(shù)位數(shù),都會導(dǎo)致發(fā)生ArithmeticError。例如下面這段代碼就會導(dǎo)致“Bit shift by negative number”錯誤。

try {
    1 >> -1;
}
catch(ArithmeticError $e) {
    echo $e->getMessage();
}

而DivisionByZeroError則表示除數(shù)為0而導(dǎo)致的錯誤(無論我們使用 / % 或 intdiv(),只要除數(shù)為0,都會導(dǎo)致這個錯誤)。

TypeError

我們在前面的視頻介紹過PHP 7的scalar type hints以及strict mode。無論是scalar type hints還是傳統(tǒng)的type hints(class / interface / callable / array),只要類型不匹配type hints約束的時候,就會導(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,它們不會再被set_error_handler()處理。

自定義異常

盡管Throwable是PHP 7中的頂層異常接口,但當(dāng)我們自定義異常的時候,卻不能直接實(shí)現(xiàn)它。否則PHP會提示我們下面的錯誤:

class MyException implements Throwable {}

Fatal error: Class MyException cannot implement interface Throwable, extend Exception or Error instead

為了能正確處理異常行號、文件名和stack trace,我們只能從Exception或者Error派生自己的異常類。但是,我們可以拓展新的Throwable接口,并且實(shí)現(xiàn)其中的方法:

interface MyExceptionInterface extends Throwable { }

class MyError 
    extends Error implements MyExceptionInterface { }

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21292.html

相關(guān)文章

  • PHP 錯誤與異常

    摘要:但異常捕獲后程序可以繼續(xù)執(zhí)行,而真正的錯誤出現(xiàn)后程序就必須終止異??梢允褂脕聿东@捕獲,捕獲之后后續(xù)代碼可以繼續(xù)執(zhí)行而錯誤是無法使用捕獲的如果拋出了異常,就必須捕獲它否則程序終止執(zhí)行。 PHP錯誤級別 Parse error > Fatal Error > Waning > Notice > Deprecated Deprecated 最低級別的錯誤(不推薦,不建議)使用一些過期函數(shù)的...

    longmon 評論0 收藏0
  • PHP7新特性介紹

    摘要:截止到目前為止,官方已經(jīng)發(fā)布了的版本,距離發(fā)布第一個正式版本不會很遠(yuǎn)了現(xiàn)在來說的重大特性肯定已經(jīng)是定型了,不會再有什么變動了。 截止到目前為止,PHP官方已經(jīng)發(fā)布了php7的RC7版本,距離發(fā)布第一個正式版本不會很遠(yuǎn)了!現(xiàn)在來說php7的重大特性肯定已經(jīng)是定型了,不會再有什么變動了。后續(xù)一些版本的迭代主要也就是修修bug,優(yōu)化之類的。下面就來說話我們一直期待的php7會有那些主要的變化...

    klivitamJ 評論0 收藏0
  • 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) { //...

    wemallshop 評論0 收藏0
  • PHP 7.1 新特性一覽

    摘要:版本發(fā)布在即,本文整理一下中的一些新特性以供了解。所有內(nèi)容均選自官方文檔。可空類型可空類型主要用于參數(shù)類型聲明和函數(shù)返回值聲明。主要的兩種形式如下從例子很容易理解,所指的就是通過的形式表明函數(shù)參數(shù)或者返回值的類型要么為指定類型,要么為。 PHP 7.1 release版本發(fā)布在即,本文整理一下 7.1 中的一些新特性以供了解。所有內(nèi)容均選自官方 RFC 文檔。 可空類型 可空類型主要用...

    timger 評論0 收藏0
  • 上手過渡PHP7(5)——輕量級“集合”迭代器-Generator

    摘要:輕量級集合迭代器泊學(xué)視頻鏈接泊閱文檔鏈接是加入的新語言特性。接下來,我們可以像訪問一個普通集合一樣使用現(xiàn)在重新執(zhí)行我們的文件,就不會再報錯了。簡單來說,就是一個輕量級的,可以記住自身狀態(tài)的集合迭代器。 輕量級集合迭代器-Generator泊學(xué)視頻鏈接泊閱文檔鏈接Generator是PHP 5.5加入的新語言特性。但是,它似乎并沒有被很多PHP開發(fā)者廣泛采用。因此,在我們了解PHP 7對...

    wupengyu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<