gpt4 book ai didi

error-handling - PHP 错误处理 : die() Vs trigger_error() Vs throw Exception

转载 作者:IT老高 更新时间:2023-10-28 11:48:20 26 4
gpt4 key购买 nike

关于 PHP 中的错误处理——据我所知有 3 种样式:

  1. die()exit() 样式:

    $con = mysql_connect("localhost","root","password");

    if (!$con) {
    die('Could not connect: ' . mysql_error());
    }
  2. 抛出异常风格:

     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 开发人员感到困惑的程度?

最佳答案

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

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

trigger_error() 允许您细粒度的错误报告(通过使用不同级别的错误消息),并且您可以向最终用户隐藏这些错误(使用 set_error_handler() ),但仍然保留它们在测试期间显示给您。

此外,trigger_error() 可以生成在开发过程中重要的非致命消息,可以使用自定义错误处理程序在生产代码中抑制这些消息。您也可以产生 fatal error (E_USER_ERROR),但这些错误是不可恢复的。如果您触发其中之一,则程序执行停止。这就是为什么对于 fatal 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 语句会进入您的数据库,即使不需要,您也无法控制接下来会发生什么。

关于error-handling - PHP 错误处理 : die() Vs trigger_error() Vs throw Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7063053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com