PHP异常尝试和捕获

时间:2013-06-09 00:43:30

标签: php pdo

如果我要做以下事情:

$pds= $pdo->prepare("SELECT * FROM userinfo  WHERE   username=:username AND   password=:password");

$pds->execute(array(':username' => $username, ':password' => $password));

$row = $pds->fetch(PDO::FETCH_ASSOC);

我是否需要对每个执行的命令执行try {},或者尝试使用单个catch块覆盖整个代码?

谢谢!

7 个答案:

答案 0 :(得分:5)

  

我是否需要为每个执行的命令设置一个try {},否则try块会覆盖整个代码,

都不是。

以下是现实生活中的一组正确的规则:

  • 如果是,则使用try / catch作为单个命令或一组命令
    • 您将处理错误本身。坦率地说,如果你有一个动作要做错误:例如回滚一个事务。
    • 错误是非致命的 - 绕过它
  • 所有其他异常必须由exception handler处理,而不是全局try / catch块。

虽然你可以省略后者,因为PHP内置的基本处理程序比没经验的程序员可以开发的程序更好。

答案 1 :(得分:0)

try块将无法捕获生成的第一个异常。因此,将所有3个语句放在try部分中是非常安全的。

您还可以使用多个catch块,以便可以以不同方式处理不同的异常类型,例如:

 try {
      $pds= $pdo->prepare("SELECT * FROM userinfo  WHERE   username=:username AND   password=:password");
      $pds->execute(array(':username' => $username, ':password' => $password));
      $row = $pds->fetch(PDO::FETCH_ASSOC);
 } catch (PDOException $e) {
      echo 'A pdo exception happened';
 } catch (Exception $e) {
      echo 'A different exception happened';
 }

这有助于确保您可以在问题发生后进行清理。

答案 2 :(得分:0)

您要执行的查询需要做的是:

try{
  $pds= $pdo->prepare("SELECT * FROM userinfo  WHERE   username=:username AND   password=:password");
  $pds->execute(array(':username' => $username, ':password' => $password));
}
catch(PDOException $ex){
  die("Failed to run query: " . $ex->getMessage());
  //Or Echo, or store in a variable to process if you don't want to die()
}

$row = $pds->fetch(PDO::FETCH_ASSOC);

希望这有帮助!

编辑: 此外,如果您需要更多的分离和可读性来构建查询,您可以尝试创建查询参数数组,而不是直接在execute()函数中创建数组。

$pds = $pdo->prepare("SELECT * FROM userinfo WHERE username=:username AND   password=:password");
$query_params = array(
  ':username' => $username,
  ':password' => $password
);
$result = $pds->execute($query_params);

答案 3 :(得分:-1)

你一定要学习错误处理。此外,在发布此类问题之前,您应该做一些研究(至少在stackoverflow上)。

您可以将该代码放在一个try块中。

try
{
$pds= $pdo->prepare("SELECT * FROM userinfo  WHERE   username=:username AND       password=:password");

$pds->execute(array(':username' => $username, ':password' => $password));

$row = $pds->fetch(PDO::FETCH_ASSOC);
}
catch(Exception $ex)
{


}

答案 4 :(得分:-1)

您只需在所有代码周围放置try{}块,并使用单个catch{}块捕获它。 有关详细信息,请参阅php manual

答案 5 :(得分:-1)

由于所有方法都可能抛出相同的异常:PDOException,因此将每个调用包装为自己的try/catch块是有意义的。是的,如果你需要做出反应,这取决于抛出异常的方法,而不是解析异常的errorInfo和/或errorCode(这将是驱动程序依赖)

答案 6 :(得分:-1)

一个try / catch块意味着,如果你在第一个语句中得到异常,那么剩下的就不会被执行,这在你的情况下很明显。

将来如果你有不同的情况,你的选择也会有所不同。