php捕捉Warning、Notice錯誤

語言: CN / TW / HK

點選進入“PHP開源社群”    

免費獲取進階面試、文件、影片資源

php中try catch 無法捕捉到Warning、Notice錯誤

1.解決方法

1)註冊錯誤處理函式來全域性捕捉

缺點,不能try catch馬上捕捉到,進行處理

set_error_handler([__CLASS__, 'error']);

set_exception_handler([__CLASS__, 'exception']);

register_shutdown_function([__CLASS__, 'shutdown']);

a. set_error_handler

一般用於捕捉:E_NOTICE 、E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE



不能捕捉:

E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR and E_COMPILE_WARNING。

一般與trigger_error("...", E_USER_ERROR),配合使用。

b. set_exception_handler

設定預設的異常處理程式,用於沒有用 try/catch 塊來捕獲的異常。在 exception_handler 呼叫後異常會中止。

與throw new Exception('Uncaught Exception occurred'),連用。

c. register_shutdown_function

執行機制是:php把要呼叫的函式調入記憶體。當頁面所有PHP語句都執行完成時,再呼叫此函式。

一般與trigger_error("...", E_USER_ERROR),配合使用。

d. restore_error_handler()函式

定義和用法 restore_error_handler() 函式恢復之前的錯誤處理程式,該程式是由 set_error_handler() 函式改變的。

該函式永遠返回 true。

是 set_error_handler()的反函式。

2)用error_get_last 獲取最後一個錯誤

  • 丟擲一個自定義錯誤trigger_error('flag', E_USER_NOTICE)

  • 執行可能丟擲notice的語句

  • 判斷最後一個錯誤是不是之前丟擲的,不是的話說明上一條語句丟擲了新的錯誤

  • 丟擲個能讓catch捕捉到的異常

error_get_last() 函式獲得最後發生的錯誤。該函式以陣列的形式返回最後發生的錯誤。如果沒有錯誤發生則返回 NULL 。返回的錯誤陣列包含 4 個鍵名和鍵值:

  • [type] - 錯誤型別

  • [message] - 錯誤訊息

  • [file] - 發生錯誤所在的檔案

  • [line] - 發生錯誤所在的行

語法 error_get_last()

例項:

<?php

echo $test;

print_r(error_get_last());

?>

上面程式碼的輸出如下所示:

Array

(

[type] => 8

[message] => Undefined variable: test

[file] => C:webfoldertest.php

[line] => 2

)

2.示例

try {

@trigger_error('flag', E_USER_NOTICE);

self::$_instance->ping();

$error = error_get_last();

if($error['message'] != 'flag')

throw new \Exception('Redis server went away');

} catch (\Exception $e) {

// 斷線重連

new self();

}

*宣告:本文於網路整理,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。

END

PHP開源社群

掃描關注  進入”PHP資料“

免費獲取進階

面試、文件、影片資源

點選“檢視原文”獲取更多