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

資訊專欄INFORMATION COLUMN

PHP 的 錯誤/異常 處理總結(jié)

Faremax / 2678人閱讀

摘要:這樣的話,就沒有合其他致命錯誤區(qū)分了,那么,有沒有專門處理未捕獲的異常呢答案是有的,它就是測試代碼如下讓錯誤信息在標準輸出可見回調(diào)函數(shù)簽名結(jié)果如下結(jié)論可以對未捕獲的異常進行處理,但是腳本仍然會因為致命錯誤而中斷。

錯誤

這里說的錯誤,可能是由 語法解析、運行時等各種原因產(chǎn)生的信息引起的

常見的錯誤類型 運行時錯誤

E_ERROR - 致命錯誤

定義:致命的運行時錯誤

后果:腳本終止不再繼續(xù)運行

E_WARNING - 警告

定義:運行時警告 (非致命錯誤)

后果:給出提示信息,但是腳本不會終止運行

E_NOTICE - 通知

定義:運行時通知

結(jié)果:給出通知信息,但是腳本不會終止運行

其他類型錯誤

編譯時錯誤
eg. E_PARSE E_COMPILE_ERROR E_COMPILE_WARNING ...

用戶產(chǎn)生的信息
eg. E_USER_WARNING E_USER_ERROR E_USER_NOTICE

... 等

具體如下圖:

參考:PHP-錯誤處理-預定義常量

錯誤處理

這里只針對運行時錯誤進行處理,其他(如:語法錯誤 Zend 引擎產(chǎn)生的錯誤 等)不在討論范圍內(nèi)。

設置一般錯誤的處理函數(shù)

核心方法:set_error_handler

測試代碼如下:


結(jié)果如下:

這里我們看到,set_error_handler 只對 E_WARNING E_NOTICE 進行了捕獲,并且當回調(diào)函數(shù)遇到
E_NOTICE 返回 true 的時候,我們看到底層對標準錯誤的輸出,但是遇到 E_WARNING 返回 false,我們并沒有看到底層對標準錯誤的輸出。

總結(jié),來自于官方手冊:

set_error_handler 第二個參數(shù)指定的錯誤類型都會繞過 PHP 標準錯誤處理程序

以下級別的錯誤不能由用戶定義的函數(shù)來處理: E_ERROR、 E_PARSEE_CORE_ERROR、 E_CORE_WARNINGE_COMPILE_ERROR、 E_COMPILE_WARNING

備注:此方法可有針對性的對服務產(chǎn)生的消息進行收集,處理。比如:在框架初始化時,注冊一個定制化的錯誤回調(diào)。

那致命錯誤有沒有辦法處理呢?接著看。

設置致命錯誤處理函數(shù)

我們知道致命錯誤會引起:腳本終止不再繼續(xù)運行。
那么,我們就可以利用 register_shutdown_function 方法做一些處理。
作用:注冊一個會在php中止時執(zhí)行的函數(shù)

測試代碼如下:


結(jié)果如下:

如前所述,發(fā)生致命錯誤,進程退出,但是中止之前執(zhí)行了我們注冊的回調(diào)函數(shù)。


異常

說明:我們這里指用戶自定義的異常。

try-catch 捕獲

測試代碼如下:

getMessage() . PHP_EOL;
} catch (Exception $e) {
    echo "Exception:" . $e->getMessage() . PHP_EOL;
} finally {
    echo "here is finally" . PHP_EOL;
}

結(jié)果如下:

?  answer git:(master) ? php exception.php
UserException:This is exception
here is finally

這是常見的捕獲,不做過多說明,參見:異常處理

未捕獲的異常

那么,如有拋出去的異常未被 catch,怎么辦?
我們先看一下,未被 catch 會怎么樣:


結(jié)果如下:

?  answer git:(master) ? php throw.php

Fatal error: Uncaught exception "Exception" with message "I am an exception" in /Users/javin/github/answer/throw.php:5
Stack trace:
#0 {main}
  thrown in /Users/javin/github/answer/throw.php on line 5

會出現(xiàn) 致命錯誤,腳本中斷,那么,我們當然可以用上邊所說的 register_shutdown_function 來處理。
這樣的話,就沒有合其他致命錯誤區(qū)分了,那么,有沒有專門處理未捕獲的異常呢?
答案是有的,它就是:set_exception_handler

測試代碼如下:

getMessage());
});

throw new Exception("I am an exception");
echo "I am here" . PHP_EOL;

結(jié)果如下:

?  answer git:(master) ? php throw.php
This is exception, msg:I am an exception

結(jié)論:set_exception_handler 可以對未捕獲的異常進行處理,但是腳本仍然會因為致命錯誤而中斷。


結(jié)尾

本文對 異常處理 做了簡要的總結(jié),其中涉及到三個核心方法 set_error_handler register_shutdown_function set_exception_handler,其詳細說明,請參見 官方手冊 。
同時 PHP-7 中也有一些新的特性,比如:Error 類

參考:PHP 7 錯誤處理

最后,強烈建議開啟編輯器的 語法檢查 功能,不管是 IDE,還是 GUI 文本編輯器,還是 vim,這樣可以避免很多不必要的錯誤。如果有使用版本控制,可以給對應的軟件加上 語法檢查 的鉤子。

可以參考:

我的 vim-配置

自動化檢測PHP語法和編程規(guī)范(Git pre-commit)


以上如有錯誤,請多多指正。如有遺漏,請多多補充。?

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

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

相關文章

  • php之道》讀后總結(jié) php學習綱要

    摘要:日期和時間使用類完成讀取設置比較和計算日期與時間。單元測試單元測試是從編寫開始,貫穿于整個開發(fā)周期的一種用于保證函數(shù)類和方法的行為與預期一致的編程方法。是應用的單元測試框架的業(yè)界標準,其他幾個可選框架是行為驅(qū)動開發(fā)行為驅(qū)動開發(fā)有兩種方式和。 《php之道》閱讀地址:http://wulijun.github.io/php-the-right-way/#code_style_guide ...

    gitmilk 評論0 收藏0
  • PHP框架中日志系統(tǒng)

    摘要:一的幾個函數(shù)異常捕獲自定義處理函數(shù)注冊錯誤捕獲自定義處理函數(shù)注冊程序執(zhí)行時異常終止錯誤捕獲處理函數(shù)注冊這三個函數(shù)在錯誤處理控制中給開發(fā)者提供了很大的自主空間,在日志系統(tǒng)中記錄日志信息有他們的功勞。下面要說的類庫是借鑒了日志系統(tǒng)的設計。 引言 接觸過php框架的朋友們可能都知道,日志在項目中的重要作用了,他可以幫助我們定位錯誤的位置,讓程序更友好(處理得當?shù)脑挷粫苯訏伋鲆淮蠖阎挥谐?..

    ningwang 評論0 收藏0
  • Python常見異常問題總結(jié)

      小編寫這篇文章的一個主要目的,就是來給大家去做一個解答,解答的內(nèi)容主要是Python常見的一些bug和異常問題,那么,遇到這些問題的時候,我們需要找到好辦法去進行處理。那么,小編這邊就給大家做了一個總結(jié),總結(jié)常見的異常問題,大家好好閱讀哦?! ‘惓L幚斫榻B  在實際的開發(fā)中,我們經(jīng)常遇到一些報錯的例子,在pycharm的顯示頁面下,當我們看到一串串的紅色的英文字母的時候,就是出現(xiàn)異常,這個時候...

    89542767 評論0 收藏0

發(fā)表評論

0條評論

Faremax

|高級講師

TA的文章

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