簡體   English   中英

PHP錯誤處理和異常處理?

[英]PHP error handling and exception handling?

我一直在進行有關PHP錯誤處理以及異常處理的研究。

例如,要處理用戶錯誤,最好對用戶錯誤使用set_error_handler() 示例代碼:

// Destinations
define("ADMIN_EMAIL", "nobody@stanford.edu"); 
define("LOG_FILE", "/my/home/errors.log");

// Destination types
define("DEST_EMAIL", "1");
define("DEST_LOGFILE", "3");

/**
* my_error_handler($errno, $errstr, $errfile, $errline)
*
* Author(s): thanosb, ddonahue
* Date: May 11, 2008
* 
* custom error handler
*
* Parameters:
*  $errno:   Error level
*  $errstr:  Error message
*  $errfile: File in which the error was raised
*  $errline: Line at which the error occurred
*/

function my_error_handler($errno, $errstr, $errfile, $errline)
{  
 switch ($errno) {
 case E_USER_ERROR:
  // Send an e-mail to the administrator
  error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_EMAIL, ADMIN_EMAIL);

  // Write the error to our log file
  error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_LOGFILE, LOG_FILE);
  break;

case E_USER_WARNING:
  // Write the error to our log file
  error_log("Warning: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
  break;

case E_USER_NOTICE:
  // Write the error to our log file
  error_log("Notice: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
  break;

default:
  // Write the error to our log file
  error_log("Unknown error [#$errno]: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
  break;
}

// Don't execute PHP's internal error handler
return TRUE;
}


// Use set_error_handler() to tell PHP to use our method
$old_error_handler = set_error_handler("my_error_handler");

可以在http://www.stanford.edu/dept/its/communications/webservices/wiki/index.php/How_to_perform_error_handling_in_PHP找到代碼。

然后針對致命錯誤:

register_shutdown_function('handleShutdown');

function handleShutdown() {
    $error = error_get_last();
    if($error !== NULL){
        $info = "[SHUTDOWN] file:".$error['file']." | ln:".$error['line']." |    msg:".$error['message'] .PHP_EOL;
        yourPrintOrMailFunction($info);
    }
    else{
        yourPrintOrMailFunction("SHUTDOWN");
    }
}

在“ 如何捕獲PHP致命錯誤 ”中找到的代碼。

據我所知,這似乎將涵蓋腳本中可能發生的所有錯誤(作為非常籠統的陳述-很難預測所有錯誤)。 考慮到在開發類時,似乎建議使用異常在內部處理它們。

我的問題是,通常認為這些示例是否適合處理生產環境中的錯誤,或者是否公然不正確或缺少任何示例。

無論如何,這些功能是附加到所有文件還是在類中設置的?

任何幫助表示贊賞。

編輯:我也打算添加,如果遇到某個錯誤,我將如何停止腳本。 顯然, exit()die()可以解決問題,但是還有其他更合適的方法嗎?

我的問題是,通常認為這些示例是否適合處理生產環境中的錯誤,或者是否公然不正確或缺少任何示例。

是的。 您只需要確保捕獲所有生成的異常即可。 我還想記住您,如果腳本中存在synthax錯誤,或者服務器配置錯誤,php可能會輸出未處理的錯誤,因為它們是編譯時錯誤。

在任何情況下,這些功能是附加在所有文件上還是在類中設置的?

一旦您使用set_error_handler注冊了它們,就將它們應用於腳本中調用的每個文件,除非其中一個文件重新定義了處理程序。

停止腳本是個好方法

有一些方法可以將所有錯誤作為異常處理,這很好,我已經在一個或兩個項目中做到了,並且我對結果感到滿意。

但是請注意,甚至警告和聲明也將是致命的(因為如果未捕獲,則異常是致命的)。 此外,語法錯誤不會作為異常處理,因為它們不是運行時錯誤,而是編譯時(這意味着您的腳本從未編譯,也沒有運行任何代碼行)。

我的問題是,通常認為這些示例是否適合處理生產環境中的錯誤,或者是否公然不正確或缺少任何示例。

PHP Errors是..它們很好,您只需要為錯誤提供更好的存儲,尤其是當您使用多個服務器時

Exceptions我認為這還不夠……需要根據類型來處理它們,例如數據庫,網絡等。

暫無
暫無

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

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