PHP 错误处理: die() Vs touch_Error() Vs throw Exception

关于 PHP 中的错误处理——据我所知有3种样式:

  1. die()or exit()风格:

    $con = mysql_connect("localhost","root","password");
    
    
    if (!$con) {
    die('Could not connect: ' . mysql_error());
    }
    
  2. throw Exception style:

     if (!function_exists('curl_init')) {
    
    
    throw new Exception('need the CURL PHP extension.
    Recomplie PHP with curl');
    }
    
  3. trigger_error() style:

    if(!is_array($config) && isset($config)) {
    trigger_error('Error: config is not an array or is not set', E_USER_ERROR);
    }
    

Now, in the PHP manual all three methods are used.

  • What I want to know is which style should I prefer & why?

  • Are these 3 drop in replacements of each other & therefore can be used interchangeably?

Slightly OT: Is it just me or everyone thinks PHP error handling options are just too many to the extent it confuses php developers?

33094 次浏览

我通常使用第一种方法在开发代码中进行简单的调试。不推荐用于生产。最好的方法是抛出异常,您可以在程序的其他部分捕获异常并对其进行一些错误处理。

这三种样式并不是相互替代的。第一种方法根本不是错误,而是一种停止脚本并输出一些调试信息供您手动解析的方法。第二个错误本身并不是一个错误,但是如果您没有捕捉到它,它将被转换成一个错误。最后一个是在 PHP 引擎中触发一个真正的错误,这个错误将根据 PHP 环境的配置进行处理(在某些情况下显示给用户,在另一些情况下只是登录到一个文件或根本没有保存)。

第一个不应该用在生产代码中,因为它传输的信息与最终用户无关(用户不能对 “无法连接到数据库”做任何事情)。

如果您知道在某个关键的代码点,您的应用程序 都会失败并且您希望您的代码跨多个调用级别进行恢复,则会引发异常。

trigger_error()允许细粒度的错误报告(通过使用不同级别的错误消息) ,并且可以向最终用户隐藏这些错误(使用 set_error_handler()) ,但在测试期间仍然可以将它们显示给您。

此外,trigger_error()还可以生成在开发期间非常重要的非致命消息,这些消息可以使用自定义错误处理程序在生产代码中抑制。您也可以产生致命的错误(E_USER_ERROR) ,但是这些错误是不可恢复的。如果触发其中之一,程序将在此时执行 停止。这就是为什么对于致命错误,应该使用异常。这样,您就可以更好地控制程序的流程:

// Example (pseudo-code for db queries):


$db->query('START TRANSACTION');


try {
while ($row = gather_data()) {
$db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
}
$db->query('COMMIT');
} catch(Exception $e) {
$db->query('ROLLBACK');
}

在这里,如果 gather_data()只是发出嘎嘎声(使用 E_USER_ERRORdie()) ,那么以前的 INSERT语句可能已经进入了您的数据库,即使您不希望这样,您也无法控制接下来会发生什么。