尝试catch vs if else在PDO和其他一些东西


try catch vs if else in PDO and some other things

我发现了这样一个问题:

与if {} else{}相比,使用try {} catch{}的优势是什么?

如果你可以添加任何东西,那么请做,因为我是新的PDO,这也意味着什么;

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

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

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

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

抛出异常:

throw new Exception();

触发程序错误:

trigger_error($message, U_USER_ERROR);

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

嗯,它们非常相似。在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{}块内的脚本的其余部分将被跳过。

另一个区别(我最喜欢的一个)是您可以创建几个类(扩展主ExceptionPDOException或其他)并自定义非常您的错误处理行为。您可以无限地定制您的类,添加函数,编辑已经存在的类。您可以添加特定的函数(如$e->fileGenerate();),并在需要的地方在catch() {}块内调用它们。

还请注意,如果您希望整个脚本在发生错误时停止,则意味着该错误需要trigger_error();相反,如果您希望错误只停止与该错误相关的特定代码块,那么就应该使用try and catch。

你不应该用一个代替另一个,你应该在另一个旁边使用一个来评估每个错误。

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

引用:

  • PDO: setAttribute ()
  • set_error_handler ()
  • set_exception_handler ()
  • <
  • 预定义的异常/gh>