【问题标题】:What type of exception to throw for custom errors?为自定义错误抛出什么类型的异常?
【发布时间】:2015-01-09 14:07:53
【问题描述】:

我有以下脚本。

根据http://php.net/manual/en/class.pdoexception.php,您不应该从自己的代码中抛出 PDOException。

但无论是 PDOException 还是我为无效 foo 抛出的异常,我都希望执行相同的捕获。

还有人告诉我,我永远不应该捕获通用异常,而只能捕获特定异常。

这应该如何实现?

 try {
    db::db()->beginTransaction();

    //Do a bunch of queries, and a PDO exception will be thrown upon error

    if($foo($bar)) {throw new Exception('Invalid foo.');}

    db::db()->commit();
} catch (PDOException $e) {
    db::db()->rollBack();
    //Maybe do some other stuff
}

【问题讨论】:

  • 不要认为泛型异常有什么问题。你可以抛出并捕获 RuntimeException

标签: php exception


【解决方案1】:

类似

try {
    db::db()->beginTransaction();

    //Do a bunch of queries, and a PDO exception will be thrown upon error

    if($foo($bar)) {throw new RuntimeException('Invalid foo.');}

    db::db()->commit();
} catch (PDOException $e) {
    db::db()->rollBack();
    //Maybe do some other stuff
} catch (RuntimeException $e) {
    //foo invalid
}

【讨论】:

  • 谢谢安东尼。那么,如果我希望回滚 RuntimeException,只需在两个 catch 语句中复制代码即可?
  • 或者只是抛出并捕获一个通用异常。或者将回滚代码放在一个函数中,在两个地方都调用该函数。
  • 最后一个问题。有什么理由我不想抛出 RuntimeException 并捕获通用异常?
  • 对于一般异常,您将捕获所有异常,包括 PDOException 和其他可能从代码的其他部分抛出的异常。这可能不是你想要的,你可能想对每种类型做不同的事情
  • 抱歉继续,但没想到您会回复。那么,我为什么要考虑按照您之前的建议“只抛出并捕获一个通用异常”?
猜你喜欢
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2021-05-07
  • 2011-10-06
相关资源
最近更新 更多