关于 PHP 中的错误处理——据我所知有 3 种风格:
-
die()
or exit()
style:
$con = mysql_connect("localhost","root","password");
if (!$con) {
die('Could not connect: ' . mysql_error());
}
-
throw Exception
style:
if (!function_exists('curl_init')) {
throw new Exception('need the CURL PHP extension.
Recomplie PHP with curl');
}
-
trigger_error()
style:
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 错误处理选项只是too many它在多大程度上让 php 开发人员感到困惑?
第一个永远不应该在生产代码中使用,因为它传输与最终用户无关的信息(用户无法对“无法连接到数据库”).
如果您知道在某个关键代码点,您的应用程序将抛出异常can fail并且您希望代码能够跨多个调用级别进行恢复。
trigger_error()
允许您细粒度错误报告(通过使用不同级别的错误消息),并且您可以向最终用户隐藏这些错误(使用set_error_handler() http://php.net/manual/en/function.set-error-handler.php)但仍然在测试期间向您显示它们。
Also trigger_error()
可以在开发过程中产生重要的非致命消息,可以使用自定义错误处理程序在生产代码中抑制这些消息。您也可能会产生致命错误(E_USER_ERROR
)但这些是不可恢复的。如果触发其中之一,程序就会执行stops在那时候。这就是为什么对于致命错误,应该使用异常。这样,您将可以更好地控制程序的流程:
// 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_ERROR
or die()
)有机会,以前INSERT
语句将进入您的数据库,即使不需要,并且您无法控制接下来会发生什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)