php - 如何捕获意外错误?

时间:2011-02-10 21:33:25

标签: php try-catch

我正在编写一个脚本,很多东西都可能出错。我正在为明显的事情制作if / else语句,这可能会让人感到困惑,但有没有办法去捕捉某些东西,这可能会导致麻烦,但我不知道它到底是什么?

例如,在脚本中间会出现某种错误。我想通知用户,出现了问题,但没有几十个php警告脚本。

我需要像

这样的东西
-- start listening && stop error reporting --

the script

-- end listening --

if(something went wrong)
$alert = 'Oops, something went wrong.';
else
$confirm = 'Everything is fine.'

感谢。

5 个答案:

答案 0 :(得分:5)

为什么不试试......抓住?

$has_errors = false;    
try {
  // code here

} catch (exception $e) {    
  // handle exception, or save it for later
  $has_errors = true;
}

if ($has_errors!==false)
  print 'This did not work';

修改

以下是set_error_handler的示例,它将处理在try ... catch块的上下文之外发生的任何错误。如果PHP配置为显示通知,这也将处理通知。

基于以下代码:http://php.net/manual/en/function.set-error-handler.php

set_error_handler('genericErrorHandler');

function genericErrorHandler($errno, $errstr, $errfile, $errline) {
    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting
        return;
    }

    switch ($errno) {
    case E_USER_ERROR:
        echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
        echo "  Fatal error on line $errline in file $errfile";
        echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
        echo "Aborting...<br />\n";
        exit(1);
        break;

    case E_USER_WARNING:
        echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
        break;

    case E_USER_NOTICE:
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;

    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    /* Don't execute PHP internal error handler */
    return true;
}
$v = 10 / 0 ;
die('here'); 

答案 1 :(得分:3)

阅读Exceptions

try {
   // a bunch of stuff
   // more stuff
   // some more stuff
} catch (Exception $e) {
   // something went wrong
}

答案 2 :(得分:2)

 throw new Exception('Division by zero.');    
try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

http://php.net/manual/en/language.exceptions.php

答案 3 :(得分:1)

您绝对应该使用try-catch语法来捕获脚本引发的任何异常 此外,您可以extend exceptions并实现满足您需求的新功能。这样,当您发现任何其他类型的意外错误(脚本逻辑错误)时,您可以抛出自己的异常。
一个非常简短的例子,解释了扩展异常的使用:

 //your own exception class
 class limitExceededException extends Exception { ... }

 try{
 // your script here
 if($limit > 10)
     throw new limitExceededException();
 }catch(limitExceededException $e){//catching only your limit exceeded exception
     echo "limit exceeded! cause : ".$e->getMessage(); 
 }catch(Exception $e){//catching all other exceptions
     echo "unidentified exception : ".$e->getMessage(); 
 }

答案 4 :(得分:0)

除了使用try / catch之外,我认为考虑是否应该捕获意外错误也很重要。如果它是意外的,那么您的代码不知道如何处理它并允许应用程序继续可能产生错误的数据或其他不正确的结果。最好让它崩溃到错误页面。我最近遇到了一个问题,其中有人为所有内容添加了通用异常处理程序,它隐藏了异常的原始位置,使得很难找到错误。