PHP 错误处理: die() vs trigger_error() vs throw 异常

2022-08-30 07:03:20

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

  1. die()或样式:exit()

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

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

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

现在,在PHP手册中,使用了所有三种方法。

  • 我想知道的是我应该更喜欢哪种风格,为什么?

  • 这3个滴在彼此的替代品中,因此可以互换使用吗?

稍微OT:是只有我还是每个人都认为PHP错误处理选项太多了,以至于让php开发人员感到困惑?


答案 1

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

如果您知道在某个关键代码点,应用程序可能会失败,并且您希望代码在多个调用级别之间恢复,则可以引发异常。

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


答案 2

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

这三种样式不是彼此的直接替代品。第一个根本不是错误,而只是一种停止脚本并输出一些调试信息以供手动分析的方法。第二个本身不是错误,但如果你不抓住它,它将被转换为错误。最后一个是在PHP引擎中触发一个真正的错误,该错误将根据PHP环境的配置进行处理(在某些情况下向用户显示,在其他情况下只是登录到文件或根本不保存)。


推荐