我有一种情况,我想在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
中实际上还有几行代码,我不想重复。我当然可以将它们提取到一种方法,但这感觉就像是矫枉过正。
所以基本上我想在线进行,无需添加额外的图层。有什么建议吗?
答案 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
}