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

資訊專欄INFORMATION COLUMN

PHP錯誤、異常匯總

yanbingyun1990 / 3423人閱讀

摘要:運(yùn)行時(shí)警告非致命錯誤。初始化啟動過程中發(fā)生的警告非致命錯誤。表示腳本遇到可能會表現(xiàn)為錯誤的情況用戶產(chǎn)生的通知信息。該函數(shù)以數(shù)組的形式返回最后發(fā)生的錯誤。所以異常經(jīng)常被當(dāng)做程序的控制流程使用。在調(diào)用后異常會中止。

Error Error級別 Fatal Error:致命錯誤(腳本終止運(yùn)行)
E_ERROR          致命的運(yùn)行時(shí)的致命錯誤,終止程序執(zhí)行
E_CORE_ERROR PHP 啟動時(shí)的致命錯誤
E_COMPILE_ERROR  PHP編譯時(shí)的致命錯誤
E_USER_ERROR     用戶產(chǎn)生的致命錯誤
Parse Error:編譯時(shí)的解析錯誤(腳本終止運(yùn)行)
Parse Error  編譯時(shí)的語法解析錯誤
Warning Error:警告錯誤(僅給出提示信息,但是腳本不會終止運(yùn)行。)
E_WARNING          運(yùn)行時(shí)警告 (非致命錯誤)。
E_CORE_WARNING     PHP初始化啟動過程中發(fā)生的警告 (非致命錯誤) 。
E_COMPILE_WARNING  編譯警告
E_USER_WARNING     用戶產(chǎn)生的警告信息
Notice Error:通知錯誤(僅給出通知信息,但是腳本不會終止運(yùn)行。)
E_NOTICE       運(yùn)行時(shí)通知。表示腳本遇到可能會表現(xiàn)為錯誤的情況.
E_USER_NOTICE  用戶產(chǎn)生的通知信息。
set_error_handler()捕獲錯誤【有局限】 函數(shù)說明
set_error_handler($callback);//設(shè)置一個(gè)用戶的函數(shù)(error_handler)來處理腳本中出現(xiàn)的錯誤。
函數(shù)的局限性

以下級別的錯誤不能由用戶定義的函數(shù)來處理:
E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 調(diào)用 set_error_handler() 函數(shù)所在文件中產(chǎn)生的大多數(shù) E_STRICT。

也就是:set_error_handler($callback)只能捕獲系統(tǒng)產(chǎn)生的一些Warning、Notice級別的Error。

使用方法

輸出結(jié)果:

"errno":8
"errstr":Undefined variable: test
"errfile":/Users/shuchao/Desktop/handler.php
"errline":13
如何捕獲PHP的Fatal Error、Parse Error等 需求描述

獲取PHP的fatal error,比如記錄到Log里面,利于我們分析線上問題,可以做線上服務(wù)的監(jiān)控。

兩個(gè)函數(shù) register_shutdown_function()
register_shutdown_function($callback)

register_shutdown_function(),就把你要注冊進(jìn)去的function放進(jìn)【假裝是隊(duì)列吧】,等到腳本正常退出或顯示調(diào)用exit時(shí),再把注冊進(jìn)去的function拉出來執(zhí)行.

register_shutdown_function()調(diào)用的3種情況:

腳本正常退出時(shí);

在腳本運(yùn)行(run-time not parse-time)出錯退出時(shí);

用戶調(diào)用exit方法退出時(shí)。

error_get_last()
error_get_last();//函數(shù)獲取最后發(fā)生的錯誤。

該函數(shù)以數(shù)組的形式返回最后發(fā)生的錯誤。

返回的數(shù)組包含 4 個(gè)鍵和值:

[type] - 錯誤類型
[message] - 錯誤消息
[file] - 發(fā)生錯誤所在的文件
[line] - 發(fā)生錯誤所在的行

使用方法

強(qiáng)烈注意

在parse-time出錯的時(shí)候,是不會調(diào)用register_shutdown_function()函數(shù)的。只有在run-time出錯的時(shí)候,才會調(diào)用register_shutdown_function()。

下面我們舉例說明:

NO.1
error_handler.php

執(zhí)行結(jié)果如下:

Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/error_handler.php:6) in /Users/shuchao/Desktop/error_handler.php on line 7
原因分析

在執(zhí)行error_handler.php的時(shí)候,由于重復(fù)定義了兩個(gè)函數(shù)test(),在php的parse-time就出錯了(不是run-time),所以不能回調(diào)register_shutdown_function()中的函數(shù)。

NO.2
error_handler.php

執(zhí)行結(jié)果如下:

Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/error_handler.php:9) in /Users/shuchao/Desktop/error_handler.php on line 7
Yeah,it"s worked!%
原因分析

我們看到,上面回調(diào)了register_shutdown_function().
因?yàn)槲覀兗恿艘粋€(gè)if()判斷,if()里面的test()方法,相當(dāng)于一個(gè)閉包,與外面的test()名稱不沖突。
也就是,上面的代碼在parse-time沒有出錯,而是在run-time的時(shí)候出錯了,所以我們能夠獲取到fatal error。

NO.3
error_handler.php

test_error.php

執(zhí)行 test_error.php的結(jié)果如下

Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/test_error.php:3) in /Users/shuchao/Desktop/test_error.php on line 4
原因分析

當(dāng)我們在運(yùn)行test_error.php的時(shí)候,因?yàn)閞edeclare了兩個(gè)test()方法,所以php的語法解析器在parse-time的時(shí)候就出錯了。 所以不能回調(diào)register_shutdown_function()中的方法,不能catch住這個(gè)fatal error。

NO.4
error_handler.php

test_error.php

include_all.php
require "./error_handler.php";
require "./test_error.php";

執(zhí)行 include_all.php的結(jié)果如下

Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/include_all.php:2) in /Users/shuchao/Desktop/include_all.php on line 3
Yeah,it"s worked!%
結(jié)果分析

上面我們捕獲了fatal_error.
因?yàn)樵谶\(yùn)行include_all.php的時(shí)候,include_all.php本身語法并沒有出錯,也就是在parse-time的時(shí)候并沒有出錯,而是include的文件出錯了,也就是在run-time的時(shí)候出錯了,這個(gè)時(shí)候是能回調(diào)register_shutdown_function()中的函數(shù)的。

強(qiáng)烈建議:如果我們要使用register_shutdown_function進(jìn)行錯誤捕捉,使用NO.4,最后一種方法,可以確保錯誤都能捕捉到。
更優(yōu)美的寫法·獲取所有錯誤 set_error_handler()與register_shutdown_function()、error_get_last()的結(jié)合使用

Exception
Exception與Error的區(qū)別
Exception

當(dāng)異常拋出的時(shí)候,我們是想要去捕獲他,并去做處理的。
所以異常經(jīng)常被當(dāng)做程序的控制流程使用。

Error

Error是不可恢復(fù)的,是在開發(fā)過程中要去解決的。

使用Exception的例子

我想執(zhí)行insert語句插入一條數(shù)據(jù),可能插入失敗(比如ID重復(fù)),注意是可能失敗,所以這是一個(gè)可能的情況,也就是異常情況。
我們就可以使用異常來處理這個(gè)問題

try {
  $row->insert();
  $inserted = true;
} catch (Exception $e) {
  echo "There was an error inserting the row - ".$e->getMessage();
  $inserted = false;
}

echo "Some more stuff";
如何catch一個(gè)未捕獲的Exception 場景描述

假設(shè)程序中的有些地方直接throw了異常,沒有進(jìn)行catch。
我們現(xiàn)在想要不管在程序的任何一個(gè)地方throw異常,即便在throw的地方?jīng)]有被catch,我們也要能catch住,如何做到呢?

一個(gè)函數(shù):set_exception_handler()
//設(shè)置默認(rèn)的異常處理程序,用于沒有用 try/catch 塊來捕獲的異常。 在 exception_handler 調(diào)用后異常會中止。
set_exception_handler()
使用示例 1、exception_handler.php
getMessage();
}
2、test_exception.php

現(xiàn)在我們運(yùn)行 test_exception.php,結(jié)果如下:

I am Exception //證明我們throw的Exception被捕獲了

更多精彩,請關(guān)注公眾號“聊聊代碼”,讓我們一起聊聊“左手代碼右手詩”的事兒。

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

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

相關(guān)文章

  • PHP socket初探 --- select系統(tǒng)調(diào)用

    摘要:原文地址在初探先從一個(gè)簡單的服務(wù)器開始中依次講解了三個(gè)逐漸進(jìn)步的服務(wù)器只能服務(wù)于一個(gè)客戶端的服務(wù)器利用可以服務(wù)于多個(gè)客戶端的額服務(wù)器利用預(yù)派生進(jìn)程服務(wù)于多個(gè)客戶端的服務(wù)器最后一種服務(wù)器的進(jìn)程模型基本上的大概原理其實(shí)跟我們常用的是非常 [原文地址:https://blog.ti-node.com/blog...] 在<PHP socket初探 --- 先從一個(gè)簡單的socket服務(wù)器開始...

    springDevBird 評論0 收藏0
  • 異常機(jī)制詳解

    摘要:當(dāng)運(yùn)行時(shí)系統(tǒng)遍歷調(diào)用棧而未找到合適的異常處理器,則運(yùn)行時(shí)系統(tǒng)終止。不可查異常編譯器不要求強(qiáng)制處置的異常包括運(yùn)行時(shí)異常與其子類和錯誤。 目錄介紹 1.什么是異常 2.異常 2.1 異常的概述和分類【了解】 2.2 JVM默認(rèn)是如何處理異常的【理解】 2.3 異常處理的兩種方式【理解】 2.4 try...catch的方式處理異常【掌握】 2.5 編譯期異常和運(yùn)行期異常的區(qū)別【理解】...

    wanghui 評論0 收藏0
  • 網(wǎng)絡(luò)請求異常攔截優(yōu)化

    目錄介紹 01.網(wǎng)絡(luò)請求異常分類 02.開發(fā)中注意問題 03.原始的處理方式 04.如何減少代碼耦合性 05.異常統(tǒng)一處理步驟 06.完成版代碼展示 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎(chǔ)及深入知識點(diǎn),Android技術(shù)博客,Python學(xué)習(xí)筆記等等,還包括平時(shí)開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題,長期更新維護(hù)并且修正,持續(xù)完善……開源的文件是m...

    番茄西紅柿 評論0 收藏0
  • 網(wǎng)絡(luò)請求異常攔截優(yōu)化

    目錄介紹 01.網(wǎng)絡(luò)請求異常分類 02.開發(fā)中注意問題 03.原始的處理方式 04.如何減少代碼耦合性 05.異常統(tǒng)一處理步驟 06.完成版代碼展示 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎(chǔ)及深入知識點(diǎn),Android技術(shù)博客,Python學(xué)習(xí)筆記等等,還包括平時(shí)開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題,長期更新維護(hù)并且修正,持續(xù)完善……開源的文件是ma...

    lemon 評論0 收藏0

發(fā)表評論

0條評論

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