国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP錯誤、異常匯總

yanbingyun1990 / 3416人閱讀

摘要:運行時警告非致命錯誤。初始化啟動過程中發生的警告非致命錯誤。表示腳本遇到可能會表現為錯誤的情況用戶產生的通知信息。該函數以數組的形式返回最后發生的錯誤。所以異常經常被當做程序的控制流程使用。在調用后異常會中止。

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

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

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

使用方法

輸出結果:

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

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

兩個函數 register_shutdown_function()
register_shutdown_function($callback)

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

register_shutdown_function()調用的3種情況:

腳本正常退出時;

在腳本運行(run-time not parse-time)出錯退出時;

用戶調用exit方法退出時。

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

該函數以數組的形式返回最后發生的錯誤。

返回的數組包含 4 個鍵和值:

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

使用方法

強烈注意

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

下面我們舉例說明:

NO.1
error_handler.php

執行結果如下:

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
原因分析

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

NO.2
error_handler.php

執行結果如下:

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!%
原因分析

我們看到,上面回調了register_shutdown_function().
因為我們加了一個if()判斷,if()里面的test()方法,相當于一個閉包,與外面的test()名稱不沖突。
也就是,上面的代碼在parse-time沒有出錯,而是在run-time的時候出錯了,所以我們能夠獲取到fatal error。

NO.3
error_handler.php

test_error.php

執行 test_error.php的結果如下

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
原因分析

當我們在運行test_error.php的時候,因為redeclare了兩個test()方法,所以php的語法解析器在parse-time的時候就出錯了。 所以不能回調register_shutdown_function()中的方法,不能catch住這個fatal error。

NO.4
error_handler.php

test_error.php

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

執行 include_all.php的結果如下

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!%
結果分析

上面我們捕獲了fatal_error.
因為在運行include_all.php的時候,include_all.php本身語法并沒有出錯,也就是在parse-time的時候并沒有出錯,而是include的文件出錯了,也就是在run-time的時候出錯了,這個時候是能回調register_shutdown_function()中的函數的。

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

Exception
Exception與Error的區別
Exception

當異常拋出的時候,我們是想要去捕獲他,并去做處理的。
所以異常經常被當做程序的控制流程使用。

Error

Error是不可恢復的,是在開發過程中要去解決的。

使用Exception的例子

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

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一個未捕獲的Exception 場景描述

假設程序中的有些地方直接throw了異常,沒有進行catch。
我們現在想要不管在程序的任何一個地方throw異常,即便在throw的地方沒有被catch,我們也要能catch住,如何做到呢?

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

現在我們運行 test_exception.php,結果如下:

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21932.html

相關文章

  • PHP socket初探 --- select系統調用

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

    springDevBird 評論0 收藏0
  • 異常機制詳解

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

    wanghui 評論0 收藏0
  • 網絡請求異常攔截優化

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

    番茄西紅柿 評論0 收藏0
  • 網絡請求異常攔截優化

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

    lemon 評論0 收藏0

發表評論

0條評論

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