2013-06-13 14 views
0

編輯:關於上面的鏈接的答案,這是類似的,但不同的,因爲我的目標是要調試錯誤錯誤頁面。如何自動停止任何腳本,並重定向到一個錯誤頁面,如果錯誤/警告/通知是未捕獲


有時意外的錯誤是很難調試,因爲打印錯誤報告奇怪的HTML元素裏面,就像一個隱藏的股利或一個選項元素。

請問有沒有辦法自動存儲在全局變量中的錯誤對象和腳本重定向到一個錯誤頁面,如果任何未捕獲錯誤解僱?有沒有辦法爲所有錯誤做到這一點,包括通常不會退出腳本的錯誤,如警告和通知?

+0

的[捕獲所有的錯誤和重定向到與PHP頁面(http://stackoverflow.com/questions/1778455/catching-all-errors-and-redirecting-to-page-with-可能重複PHP) –

+1

你有沒有嘗試閱讀關於PHP例外http://php.net/manual/en/language.exceptions.php? –

+0

@JamesDonnelly:好吧,這不是重複的,因爲我想爲任何錯誤做。 –

回答

0

感謝@MladenB。並欺騙,我解決了我的問題。這是我的編碼解決方案:

在config.php文件,將包含在你的腳本(最好是移動功能到個人資料庫文件):

<?php 

function my_error_handler($errno, $errstr, $errfile, $errline) 
{ 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 

function my_exception_handler($e) 
{ 
    /** 
    * Exception handler that pass the error object to an error page. 
    * This is to avoid bad displaying or hiding of error reports. 
    * 
    * @param $e Exception The exception to manage 
    */ 

    if (session_status() !== PHP_SESSION_ACTIVE) 
    { 
     session_start(); 
    } 

    session_register_shutdown(); 

    $_SESSION['error'] = $e; 

    header('Location: error.php'); 
    exit(); 
} 

set_error_handler('my_error_handler'); 
set_exception_handler('my_exception_handler'); 
在error.php

<?php 

session_start(); 
session_register_shutdown(); 

$e = $_SESSION['error']; 

echo '<h2>Stack trace</h2>'; 
echo var_dump($e->getTrace()); 

throw $e; 
3

你這樣做有custom error handler。談到錯誤到異常是一個很好的方式,讓你在錯誤處理非常精細的控制:

set_error_handler(function ($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 
}); 

您可以決定哪些錯誤拋出異常並忽略;例如,您可能需要忽略或僅記錄E_NOTICE。使用全球try..catch區段或custom exception handler,您現在可以輕鬆決定在發生錯誤時應採取的措施。

+0

...你也應該知道ob_ *函數集:http://www.php.net/manual/en/ref.outcontrol.php。緩衝你的站點輸出並只在沒有錯誤發生時刷新它,如果發生錯誤只顯示錯誤頁面並丟棄原始站點輸出 – hek2mgl

+0

我在哪裏可以找到默認錯誤處理程序的代碼? –

+0

@ hek2mgl:我不知道我是否可以封裝你的建議。我希望在網站投入生產時輕鬆關閉此功能。 –

1

確實有辦法既重定向錯誤頁面,記錄他們,跟蹤他們,並沒有什麼。 PHP非常靈活。好消息是,你不需要自己製作這樣的方法,可以使用框架,但是如果沒有這些方法,PHP的錯誤處理功能就足夠有用了。如果配置正確,PHP將在錯誤(或警告,您決定)中放棄,記錄它們,甚至在插入Web服務器時返回HTTP 500服務器錯誤代碼。

您可能需要正確配置PHP。它完全有能力提供更好的錯誤處理工作流程。首先,禁用錯誤打印,這不是應用程序應該如何報告錯誤,並且最壞的情況是,使用打印的錯誤輸出幫助惡意用戶打破他們進入系統的方式。你不是唯一一個查看你的網頁,你知道,並不是所有的用戶看到這些都會感到困惑,有些人會等待這些。這是您可以使用的指令之一,編輯配置PHP的「php.ini」文件;它禁止混有其他任何PHP輸出錯誤輸出內容生成的一部分:

display_errors = "0" 

您還可以將其設置爲「標準錯誤」,這是一件好事,調試使用PHP命令行調用腳本時做的,如輸出將被髮送到另一個文件通道,即所謂的標準錯誤。

就拿現在注意以下「的php.ini」指令:

log_errors = "1" 

以上將有PHP錯誤日誌到文件裏,或者使用Web服務器錯誤日誌記錄設施,取決於PHP是如何調用。例如,在UNiX系統上,列出錯誤及其詳細信息的日誌文件將駐留在「/ var/log/www /」中。

走好讀通過PHP文件上的錯誤處理和報告,下面的頁面也許開始:

http://www.php.net/manual/en/book.errorfunc.php

不要忘記上安裝配置讀取。我再重複一次,從來沒有PHP顯示錯誤的公共PHP腳本!(是的,我知道你正在調試,但這些天我不能強調這一點)。

+0

我更喜歡在開發過程中顯示錯誤,因爲調試速度更快。我將在網站投入生產時記錄錯誤。 –

+0

爲什麼不,@盧卡斯。但是,我發現在開發過程中顯示錯誤可能會干擾調試本身,因爲錯誤輸出可能會在不可見的元素中蔓延。此外,警告和其他重要信息可能會在日誌文件中結束,直到您決定發佈之前,您都不會去查看它。 500服務器錯誤代碼也是如此 - 您的腳本將生成輸出,但PHP可能會更改響應錯誤代碼,如果將這些代碼提供給Adobe Flash Player客戶端或Web服務使用者,這可能會破壞您的頁面。 – amn

相關問題