【问题标题】:die() or try/catch when interacting with MySql database in PHP?在 PHP 中与 MySql 数据库交互时是否死亡()或 try/catch?
【发布时间】:2015-11-17 14:15:19
【问题描述】:

我读过的很多教程和书籍都使用 die() 方法在与本地 MySQL 数据库交互时捕获异常

例如:

mysql_connect($dbhost, $dbuser, $dbpass)or die(mysql_error());

try/catch 块是否比 die() 方法更有益,或者这只是异常处理与数据库连接一起工作的标准方式?

【问题讨论】:

  • 当您使用 try/catch 时,您将使用 throw new Exception() 而不是 die()跨度>
  • try/catch 允许您干净地处理异常,而die() 是突然的,很少允许您显示用户友好的消息.....但mysql_connect 不会抛出任何异常,并且 MySQL_* 函数已被弃用,并且在 PHP 中将不再存在
  • 不,你可以写你喜欢的方式来处理这个异常 (stackoverflow.com/a/9836727/3615630)
  • 在开发中使用 die。如果您在 Travelocity 预订航班,您会怎么想?另外,你到底为什么要使用 mysql_* 函数?现在是 21 世纪 :>
  • 更正:很多不好的教程和书籍使用die()。连接到数据库的代码的工作不是决定应用程序何时结束或当数据库不可访问时它如何反应。忘记die(),你不需要它。 exit()(真名die())需要的地方就在header('Location:');之后,如果你不使用框架并手动处理这些事情。除此之外,exit() 的使用是一种代码味道。

标签: php mysql exception-handling


【解决方案1】:

mysql_connect 方法不会抛出异常,因此许多应用程序使用die() 在没有可用连接时终止。 您可以使用这里提到的解决方案:how to use throw exception in mysql database connect

为了完整性而包含在内:

try
{
    if ($db = mysqli_connect($hostname_db, $username_db, $password_db))
    {
        //do something
    }
    else
    {
        throw new Exception('Unable to connect');
    }
}
catch(Exception $e)
{
    echo $e->getMessage();
}

或者使用新的和更多 OOP 风格的数据库访问:http://php.net/manual/en/book.pdo.php

很多应用程序使用die 的原因是它们非常依赖数据库,以至于在没有连接的情况下继续操作是完全没有结果的。

编辑 如 cmets 中所述,上面的代码示例仅用于说明目的。投掷后立即接住是没有意义的。

【讨论】:

  • 这也是示例代码,就像or die()一样,因为您永远不会以这种方式立即try..catch出现异常。
  • “因此需要 die()” - 不,die() 不需要。当数据库不可访问时,连接到数据库的代码不负责决定应用程序的行为方式。
【解决方案2】:

or die() 是一种非常原始的“处理”错误的方法,最多只能用于示例或调试。在实践中,这取决于您如何处理错误。您可能想从函数调用中return false,或者您可能想抛出自己的异常;例如:

if (!$con = mysql_connect(..)) {
    throw new DatabaseConnectionError(mysql_error());
}

try..catch 将与mysql 完全什么都不做,因为mysql 从不抛出任何异常。它只会在失败时返回 false

您必须有自己的错误处理策略。您可能希望记录错误并显示用户友好的错误页面而不是神秘的错误消息。 mysql 不关心那部分。它只为您提供了一种检查操作是否成功的方法(检查它是否返回false);您如何处理这些信息取决于您自己。 die 杀死整个应用程序,至少不允许问题进一步传播;但它肯定不会显示任何用户友好的错误页面。

说了这么多,mysql 已经过时且已被弃用。如果您改用 PDO 等更新的东西,它可以正确地自己抛出异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多