PHP错误处理:死亡()与trigger_error()与抛出异常PHP错误处理:死亡()与trig

2019-05-12 19:50发布

在问候错误在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开发的程度?

Answer 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语句将使它成为你的数据库,即使不希望和你有过什么接下来会发生什么没有控制权。



Answer 2:

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

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



文章来源: PHP Error handling: die() Vs trigger_error() Vs throw Exception