php是否能自定義'錯誤'和'致命錯誤'訊息

edited 七月 2015 in 進階PHP討論
php 定義 錯誤和致命錯誤很重要,它們會繞過自定義錯誤處理器
所以無法用set_error_handler() 去設定錯誤和致命錯誤訊息.
而 error_reporting(0) 會關掉所有錯訊息
請問是否能對 錯誤和致命錯誤訊息 做設定
譬如發生 Fatal error 時, 可以控制出現的訊息而不是php 定義的 Fatal error messqge ?

評論

  • 我希望的處理的error type 為 E_ERROR, E_PARSE ,希望發生時我能自定義訊息顯示在網頁上,
    但set_error_handler() 實作中,與 php.net 的說明中,都無法使用 set_error_handler 做到.
    如果可以是否能給得實例?
  • 網頁中提到的範例基本上就是了,當你設定了自訂的錯誤處理類別, PHP 就會把相關資訊透過你指定的類別處理

    你只要捕捉 E_USER_ERROR 的錯誤就可以調整像是 Fatal error... 這樣的內容,除非你註冊 error_handler() 的步驟有問題
  • 感謝kiang 兄的回答,不過還是做不到修改 Fatal error .
    舉實驗例子,故意叫用空物件member function ,產生錯誤
    會在網頁上產生 Fatal error: Call to a member function show() on a non-object in.....
    希望能改寫 Fatal error:.... 內容,請教要如何修正 customError2 ?

    [code]
    set_error_handler("customError2"); //宣告自定義錯誤處理
    function customError2($errno, $errstr, $errfile, $errline){ //只顯示錯誤訊息
    echo '編號:'.$errno.'
    ';
    echo '描述:'.$errstr.'
    ';
    echo '位置:'.$errfile.'
    ';
    echo '行數:'.$errline.'
    ';
    }
    class testobj{
    function show () { echo 'hello' ; }
    }
    $aaa ->show();
    [code]
  • 我知道我的困擾在哪了,因為歷史原因,要維護的網站有ㄧ堆 E_NOTICE code,作者使用 error_reporting( E_NOTICE) 關閉了警告訊息使網站運作是正常的,
    但是如發生上述錯誤,網頁還是會 Fatal error:... 並顯示出路徑.
    難點用set_error_handler 處理了 E_NOTICE ,網頁將無法運作
    目前能想到解決方法有兩個方向
    1.知道 E_NOTICE 所有錯誤描述,用這個變數來篩選哪些事要處理的 E_NOTICE 訊息
    2.或是 找到方法直接修改 Fatal error 的顯示
    不知道方向是否正確?
  • 雖然很努力理解~不過還是問一下~是因為不爽error顯示路徑嗎?
    display_errors關掉~出http的500錯誤~在宣告500錯的網頁
  • 就是因為不爽error顯示路徑,但又不能將display_errors 全部關掉,讓錯誤發生時,user 不知道發生何事,
    noon 您提到的流程中
    display_errors關掉=>出http的500錯誤=>在宣告500錯的網頁
    出http的500錯誤此步驟具體要如何做,能舉個例子嗎?

  • 就照舊的錯誤,依舊照寫把錯誤輸出~看要忽略哪種層級
    set_error_handler('setErrorHandler');
    set_exception_handler('setExceptionHandler');
    就不會關掉就沒訊息了~這等級比較高的系統都會寫這種~甚至把錯直接寄給管理者
    隨時修正錯誤~

    那種還沒進執行的錯就直接出500
    例如apache的httpd.conf或.htaccess設
    ErrorDocument 500 "連結或訊息"

    這部分詳細設定google應該很多:關鍵字 ErrorDocument 500
    就是客製錯誤訊息~
    例如我喜歡的海賊王這種~亂打網址~出404錯~有客製化錯誤畫面
    https://one-piece.com/luffy.php

    :)) 就試試看吧~
  • edited 七月 2015
    哈~我好像搞錯層級了~那500好像是php直接丟給user..所以雖然記錄500但不會轉的樣子~
  • 感謝noon ,這個one piece 404 這概念非常棒,還可以弄成動態(每天一換or依三餐換圖).
    不過還是沒解決我的問題,持續想法子中
  • 終於找到答案了

    error_reporting (E_ALL ^ E_ERROR ) //關掉預設 E_ERROR message
    register_shutdown_function('shutdown_handler');
    function shutdown_handler(){ //自定義 Fatal Error 訊息
    {
    $err = error_get_last();
    if ($err && $err['type'] == E_ERROR) {
    $msg = 'PHP Fatal Error: '.$err['message'].' in '.basename($err['file']).
    ' on line '.$err['line'];
    echo $msg, PHP_EOL;
    }
    exit();
    }

    }

  • 在 PHP7 中新增了 EngineException 以及 ParseException
    可以用來處理 致命錯誤 以及 語法錯誤。
    只需在需要處理的區塊中 cache 對應的 exception 即可。
    詳細的內容可以參考 PHP7 RFC https://wiki.php.net/rfc/engine_exceptions_for_php7
Sign In or Register to comment.