例外和抽象

Mac*_*cha 3 language-agnostic abstraction exception

什么时候应该抛出自定义异常?

例如,我有一些连接到服务器的代码。连接到服务器的代码在连接失败时会抛出 IOException。在它所调用的方法的上下文中,这很好。在网络代码中也很好。

但由于这表示没有连接(因此无法正常工作),异常会一直上升到用户界面。在这个阶段,IOException 的含义非常模糊。像 NoConnectionException 这样的东西会更好。

所以,我的问题是:您应该在哪个阶段捕获异常,而不是抛出另一个更适合抽象的(自定义)异常?

Bri*_*new 5

我希望异常能够根据我要求原始方法执行的操作进行讨论。例如

read -> ReadException
connect -> ConnectException
buildPortfolio -> FailedToBuildPortfolioException
Run Code Online (Sandbox Code Playgroud)

这抽象了幕后发生的事情(即您是否通过套接字等进行连接)。作为一般规则,当我为组件创建接口时,我经常创建相应的异常或一组异常。我的接口将被称为Component,我的例外通常是ComponentException(例如RateSourceRateSourceException)。它可以作为完整的组件集一致且轻松地导出到不同的项目。

缺点是您会创建大量异常,并且可能需要执行大量翻译。好处是(正如您所确定的)您几乎没有抽象泄漏。

在方法调用(以及异常)的层次结构中的某个时刻,您可能会决定无法进行恢复(或者位于不适当的位置)并转换为稍后处理的未经检查的异常。