簡體   English   中英

如何記錄try / catch語句未捕獲的間歇性錯誤?

[英]How can I log an intermittent error that is not caught with a try/catch statement?

我的下載腳本中出現間歇性錯誤,無法通過try / catch捕獲或以任何可靠性復制。 渲染時,我的500 Internal Error頁面將發生的情況記錄到我的系統中。 這是似乎引發錯誤的代碼塊(如下面的日志所示)。

$logger->addDebug("User downloading widget", $dl);
header('Content-Description: File Transfer');
header('Content-type: application/octet-stream');
header('Content-length: '.filesize($dl['url']));
header('Content-Disposition: attachment; filename="'.str_replace('"', '_', $dl['name']).'"');
readfile($dl['url']);

exit();

環繞它的try/catch塊:

} catch (Exception $e) {
    $logger->addCritical('DOWNLOAD ERROR ENCOUNTERED', array (
        errorMessage => $e->getMessage()
    ));

我的日志顯示以下內容。 注意第二個日志是我的500.php中的一個,而不是catch塊中的日志。

[2015-09-27 13:21:15] Site DEBUG: User downloading widget { ... }
[2015-09-27 13:21:16] Site CRITICAL: 500 INTERNAL SERVER ERROR { ... }

Apache / PHP也配置為記錄錯誤,但是與任何事件匹配的那些日志中都沒有相關的錯誤。

$dl['url']是磁盤上存在的有效文件位置。 $dl['name']是一個存在嚴格控制的文件名值,僅是字母數字(替換只是一種安全措施)。 在瀏覽器中使用確切的URL(以及打該代碼塊的情況),我沒有收到錯誤。

我已經將其包裝在一個try / catch塊中,該塊僅嘗試記錄該錯誤,但是即使我仍然得到500條錯誤日志,也沒有從中獲取任何日志結果。 因此,現在我想我需要一種更通用的方法來獲取此錯誤。 在500錯誤頁面(在.htaccess中設置)上是否有辦法獲取觸發該頁面的服務器錯誤? 或者,是否有原因try / catch塊(只會記錄錯誤)不起作用?

您最有可能無法捕獲異常,因為沒有異常。 只是一個錯誤。

500錯誤頁面沒有有關導致其顯示的錯誤的任何信息。 但是有多種顯示或記錄錯誤的方法:

  1. 如果不是生產站點,則只需在輸出中顯示錯誤即可 您可以在php.ini.htaccess或您的PHP腳本中進行操作。 搜索error_reportingdisplay_errors

  2. 如果是生產站點,則不應向用戶顯示錯誤,而應啟用錯誤日志記錄 這些設置搜索log_errorserror_log 這些設置也可以在php.ini.htaccess或您的PHOP腳本中進行設置。 我建議您在php.ini.htaccess設置它們。

  3. 您可以實現並設置一個自定義錯誤處理程序 ,它只是一個回調函數,每當PHP錯誤發生時都會調用該函數。 在此功能中,您具有關於錯誤的所有信息(文件,行,消息,錯誤號等),並且可以在此執行任何操作。 因此,您可以例如實施自定義錯誤日志記錄。

注意 :如果您通過調用函數在PHP腳本中設置了任何這些設置,但腳本中某處存在語法錯誤,因此實際上無法對其進行解析和執行,則這些函數將不會執行,並且錯誤報告或將不會設置日志記錄。 因此,最好在php.ini.htaccess進行配置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM