例外:重新抛出和多个catch块

时间:2014-05-26 09:19:43

标签: php exception-handling

我有一种情况,我想在catch块中重新抛出异常,并让它被更通用的catch捕获。

示例:

try {
    somethingThatMightThrowExceptions();
}
catch (ClientErrorResponseException $e) {
    if ($e->getResponse()->getStatusCode() == 404) {
        return $this->notFound();
    }
    throw $e; // even tried throw new \Exception();
}
catch (\Exception $e) {
    return $this->serverError('Server error');
}

所以在我的第一个catch块中,我检查了一个特定的条件,如果失败了,我想重新抛出异常并让它被通用的catch (\Exception)块捕获。但在这种情况下,它只会回调给调用者。

问题是最终catch中实际上还有几行代码,我不想重复。我当然可以将它们提取到一种方法,但这感觉就像是矫枉过正。

所以基本上我想在线进行,无需添加额外的图层。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

这是由于只捕获一次,因为你抛出异常而没有尝试阻止。 如果你确定,你想这样做,那么你需要将try..catch语句嵌套在评论中建议的@deceze中。

你应该描述你想要完成的事情,因为可能有更好的方法。

答案 1 :(得分:0)

您有两个选择: a)提取方法的通用逻辑。 (正如您所提到的,有时这可能会过分杀伤) b)捕获最通用的异常并检查其类型。即:

try{
    somethingThatMightThrowExceptions();
}
catch (\Exception $e) { // The most generic exception
    if($e instanceof ClientErrorResponseException) {
       // Some actions specific to ClientErrorResponseException
    }

    // Shared actions
}