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

来源:互联网 发布:nes30 pro软件 编辑:程序博客网 时间:2024/05/16 14:19

问题描述:

关于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个是否相互替代,因此可以互换使用?
另外:只是我或大家都认为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');}

通常使用开发代码中的简单调试的第一种方法。不推荐用于生产环境。最好的方法是抛出一个异常throw new Exception(),你可以在程序的其他部分捕获try并执行一些错误处理。

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


阅读全文
0 0