我有一种情况,我想在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
中实际上还有多行代码,我不想重复。我当然可以将它们提取为一种方法,但这感觉有些过头了。
因此,基本上,我想在线完成所有这些操作而不必添加额外的图层。有什么建议吗?
这是因为您抛出的异常不带try块,因此只能捕获一次。如果确定要这样做,则需要按注释中的@deceze嵌套try..catch
语句。
您应该描述您要完成的任务,因为可能有更好的方法来完成它。
您有两个选择:a)提取方法的通用逻辑。 (正如您所提到的,有时这可能会过分杀伤)b)捕获最通用的异常并检查其类型。即: