【问题标题】:try catch vs if else in PDO and some other things在 PDO 和其他一些事情中尝试 catch vs if else
【发布时间】:2011-04-15 23:57:28
【问题描述】:

我发现了这个问题:

What is the advantage of using try {} catch {} versus if {} else {}

如果您可以添加任何内容,请按照我是 PDO 的新手,这也是什么意思;

$dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

在 MySQL 网站上它说 “确保创建异常而不是错误” 但我不明白这一点,请谁能详细说明一下。

【问题讨论】:

  • 你能具体解释一下你不明白的地方吗?您是指一般的例外,还是...?
  • 一般来说是不是像mysql错误?

标签: php mysql pdo


【解决方案1】:

异常可以通过 try/catch 捕获,并且是具有属性的类,而过程错误不能也不是。程序错误由 PHP 的原生错误处理来处理。

您可以通过手动触发来观察行为差异。

抛出异常:

throw new Exception();

触发程序错误:

trigger_error($message, U_USER_ERROR);

异常基本上是错误处理的OO方式。在此处查找有关异常的更多信息:http://php.net/manual/en/language.exceptions.php

【讨论】:

    【解决方案2】:

    嗯,它们非常相似。在 PHP 原生错误处理中,您可以使用 trigger_error($error, [$level]) 抛出您自己的错误,因为您可以使用 throw new MyException($error) 抛出您自己的异常;您可以使用set_error_handler() 设置默认错误处理程序,它将以您自己的方式管理所有PHP 错误(解析除外),因为您可以使用set_exception_handler() 设置默认异常处理程序。 PHP 原生错误和异常都会以某种方式自动触发/抛出:编译脚本的 PHP 原生错误,如果您使用特定项目(例如 (PDO) 或其他内容时出现异常)。

    现在让我们用不同的方法尝试相同的代码: 使用 PHP 原生错误,您可以执行以下操作:

    $db = new Database();
    if ($db === NULL) { trigger_error("Cannot connect to the database", E_USER_ERROR); }
    
    $result = $db->query("UPDATE charlieiscool SET iloveunicorns = 1 WHERE userid = 1");
    if (!$result) { trigger_error("Error updating table", E_USER_ERROR); }
    
    $file = 'log.php';
    if (!file_exists($file) or !file_get_contents($file)) { trigger_error("$file not found", E_USER_ERROR); }
    require($file);
    

    我认为这并不需要任何解释。如果触发了错误,则会跳过整个脚本并且您会看到错误。没有更多的事情可以做;你可以设置E_USER_ERRORE_USER_NOTICEE_USER_WARNING 并以不同的方式处理它们,但你没有那么大的选择。现在看一下try{} catch() {} 块的可能 OOP 方法:

    try {
        $db = new Database();
            if (!$db) { throw new DBEx("Cannot connect to the database"); }
        $result = $db->query("UPDATE charlieiscool SET iloveunicorns = 1 WHERE userid = 1");
            if (!$result) { throw new QueryEx("Query failed"); }
    } catch (PDOException $e) {
        echo $e->getMessage();
    } catch (DBEx $e) {
        $e->customFunction();
    } catch (QueryEx) {
        $e->customFunctionForQuery();
    }
    
    try {
        $file = 'log.php';
        if (!file_exists($file) or !file_get_contents($file)) { throw new FileEx("$file does not exists"); }
        require($file);
    } catch (FileEx) {
        $e->fileGenerate();
        $e->logError();
    }
    

    主要区别在于,如果第一个 try{} 块抛出异常,则第二个 try{} 将以任何方式执行。事实上,如果抛出异常,则只会跳过该 try{} 块内的其余脚本。

    另一个区别(我最喜欢的那个)是您可以创建多个类(扩展 mains ExceptionPDOException 或其他)并自定义您的错误处理行为。您有无限的可能性来自定义您的课程、添加功能、编辑现有的课程。您可以添加特定的函数(例如$e->fileGenerate();)并在需要时在catch() {} 块内调用它们。

    还要注意,如果您希望在发生错误时停止整个脚本,则意味着该错误需要trigger_error();相反,如果您希望错误只停止与该错误相关的特定代码块,那么是时候尝试捕获了。

    你不应该用一个代替另一个,你应该使用一个并排评估每个错误。

    顺便说一下PDO::setAttribute() 更改数据库处理程序中的默认值和选项。例如,您可以使用$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); 更改您的默认提取(在PDOStatement::fetch() 中使用)。

    参考资料:

    【讨论】:

    • 值得一提的是 E_USER_WARNING 和 E_USER_NOTICE 不会退出你的脚本。此外,如果您设置自己的错误处理程序 (set_error_handler),则完全取决于您是否有任何错误会退出您的脚本。
    • 非常好的例子,谢谢.. 我有一个问题 - 你是如何在 DBEx catch 块中创建 customFunction() 函数的?
    • @user791022,您必须创建类并扩展主异常类:class MyException extends Exception {}。在类中,您可以定义自定义函数/方法。
    • @JeffPigarelli 谢谢!你能在stackoverflow.com/questions/9252276/…看看我的问题吗?你会怎么做?
    猜你喜欢
    • 2012-07-05
    • 2017-06-08
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多