在问候错误在PHP处理 - 据我所知有3个款式:
die()
或exit()
风格:
$con = mysql_connect("localhost","root","password"); if (!$con) { die('Could not connect: ' . mysql_error()); }
throw Exception
的风格:
if (!function_exists('curl_init')) { throw new Exception('need the CURL PHP extension. Recomplie PHP with curl'); }
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开发的程度?
第一个不应该在生产代码中使用,因为它无关运送到最终用户的信息(用户不能做“无法连接到数据库”任何东西)。
你抛出异常,如果你知道,在某个临界点的代码,你的应用程序可能会失败 ,你希望你的代码在多个呼叫的水平回升。
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_ERROR
或die()
有一个机会,以前的INSERT
语句将使它成为你的数据库,即使不希望和你有过什么接下来会发生什么没有控制权。
我通常使用在开发代码调试简单的第一种方式。 不推荐用于生产。 最好的办法是抛出一个异常,你可以在程序的其他部分捕获并做一些错误处理上。
这三种风格不落于相互替代。 第一个是不是在所有的错误,而只是一个方法来阻止脚本和输出一些调试信息,为您手工解析。 第二个是本身并不是一个错误,但将被转换成一个错误,如果你不抓住它。 最后一个是触发,这将根据您的PHP环境的配置(以显示给用户一些情况下,在其他情况下只记录到一个文件或不保存的话)来处理PHP引擎真正的错误。