PHPerror handling:die()Vs trigger_error()Vs抛出exception

关于在PHP中的error handling – 据我所知,有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手册中使用了所有三种方法。

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

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

稍微OT:是否只是我或所有人认为PHPerror handling选项太多,以至于它迷惑PHP开发人员?

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

如果您知道在某个关键代码点,您的应用程序可能会失败,并希望您的代码跨多个调用级别恢复,则会抛出exception。

trigger_error()允许您通过使用不同级别的错误消息进行细粒度的错误报告,并且可以从最终用户(使用set_error_handler() )隐藏这些错误,但在testing过程中仍然会显示这些错误。

trigger_error()也可以产生在开发过程中非常重要的非致命的消息,这些消息可以在使用自定义error handling程序的生产代码中被抑制。 您也可能产生致命错误( E_USER_ERROR ),但这些错误不可恢复。 如果你触发其中的一个,那么程序就停止在那个点上。 这就是为什么,对于致命的错误,应该使用exception。 通过这种方式,您可以更好地控制程序的stream程:

 // 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语句可能会把它放到数据库中,即使不需要,你也不能控制接下来会发生什么。

我通常使用第一种方法在开发代码中进行简单的debugging。 不build议生产。 最好的方法是抛出一个exception,你可以在程序的其他部分捕获exception,并进行一些error handling。

这三种款式不是相互替代的。 第一个不是一个错误,而只是一个停止脚本并输出一些debugging信息给你手动分析的方法。 第二个错误本身不是错误的,但是如果你不知道它会被转换成错误。 最后一个是在PHP引擎中触发一个真正的错误,根据您的PHP环境的configuration(在某些情况下显示给用户,在其他情况下只是login到文件或根本不保存)来处理。