PHP错误处理:die()Vs trigger_error()Vs抛出异常

Cur*_*ind 116 php error-handling

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

  1. die()exit()风格:

    $con = mysql_connect("localhost","root","password");
    
    if (!$con) {
     die('Could not connect: ' . mysql_error());
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. throw Exception 样式:

     if (!function_exists('curl_init')) {
    
          throw new Exception('need the CURL PHP extension. 
                               Recomplie PHP with curl');
        }
    
    Run Code Online (Sandbox Code Playgroud)
  3. trigger_error() 样式:

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

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

  • 我想知道的是我应该选择哪种风格?为什么?

  • 这3个是否相互替换,因此可以互换使用?

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

Lin*_*een 85

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

如果您知道在某个关键代码点,您的应用程序可能会失败并且您希望代码在多个调用级别之间进行恢复,则会抛出异常.

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');
}
Run Code Online (Sandbox Code Playgroud)

在这里,如果gather_data()只是简单的嘶哑(使用E_USER_ERRORdie())有机会,以前的INSERT陈述会进入你的数据库,即使不是你想要的,你也无法控制下一步会发生什么.

  • 所以``trigger_error()`和抛出异常:我应该使用哪一个?何时使用? (2认同)
  • 看完你的例子后,我想现在我更了解抛出异常背后的目的.谢谢 :) (2认同)

Emi*_*röm 10

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

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

  • 不同之处在于您可以捕获异常并以您想要的任何方式处理它. (4认同)
  • 当异常被抛出但未被捕获时会发生什么?我猜这会导致致命错误。使用`trigger_error()` 也会发生同样的事情。那么有什么区别呢? (2认同)