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

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

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

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

有帮助吗?

解决方案

我希望例外的是什么,我问始发方法来做方面谈。 e.g。

read -> ReadException
connect -> ConnectException
buildPortfolio -> FailedToBuildPortfolioException

等。这种抽象了什么的封面(即你通过套接字连接等)下回事。作为一般规则,当我创建一个组件的接口,我经常创建一个相应的异常或设置例外。我的界面将被称为Component,和我的异常通常ComponentException(例如RateSourceRateSourceException)。这是一致的,很容易对不同的项目导出为一个完整的组件集。

缺点是,你创造了不少例外,你可能需要执行相当多的翻译。好处是,(因为你已经确定),你几乎没有抽象泄漏。

在方法调用(因而例外)的层次结构中的某一时刻,你可能会决定不恢复可能发生(或者它在不合适的地方),并转换为unchecked异常稍后处理。

其他提示

我知道这是标记为“语言无关”,但我不认为这真的是。从C ++的角度来了,我希望极少数基本操作抛出一个异常 - 在C ++标准库只使用异常在极少数地方。所以我自己的代码往往是在那里可以产生异常的第一个地方。在该代码,我喜欢一个非常平坦的层次 - 我不想与数百名捕在后面的代码搞乱()的条款,并已永远无法理解Java和C#的明显的成见与创建类和命名空间的巴洛克heirarchies <。 / p>

因此,对于我的C ++代码 - 一种类型的例外的,含有一个有意义的错误消息,每个文库。和一个用于最后的可执行文件。

我觉得这里有隐藏的两个问题: 一)一个时候应该隐藏不同的异常背后的异常。 b)一种当应该使用自定义的异常这一点。

A)我会说:当过异常的应用程序在两个层的边界移动,它应该得到隐藏的例外是新层更apropriate后面。 例如:因为你正在做一些远程的东西,你会得到一个ConnectionWhatEverException

但不呼叫者应该知道的连接问题。因为他只是想获得一些服务执行的,所以他得到一个ServiceOutOfOrderException。这样做的原因是:该层内部,做远程,你可能会做一些有用的用ConnectionException(重试,写入一个搁置队列。)。一旦你离开了那层,没有人知道如何处理ConnectionException。但是,他们应该能够决定,有什么事情做,当服务无法正常工作。

b)如果不存在匹配的现有的异常。有一对夫妇在Java中有用的异常例如。我使用的非法状态和IllegalArgument经常。一个新的异常类,一个有力的论据是,如果你有一些有用的背景下提供。例如失败可能是ServiceFailedException的论点服务的名称。只是不要创建每个方法调用,或其他类似的效果类。 100个异常类是没有问题的,只要它们具有不同的行为(即,至少不同字段)。如果它们的差异仅在于名称和驻留在同一抽象层次,使得它们一个异常,并把不同的名称的消息或异常类的单个字段英寸

c)至少在java中存在关于检查异常的讨论。我直接在未经检查的一个包裹的,因为我讨厌的那种检查。但是,这是更意见然后建议。

是否有任何情况下您会得到不是由 IO 问题引起的 NoConnectionException?相反,了解原因是否基于 IO 是否有助于客户端明智地恢复?

  

当您应该抛出一个自定义异常?

予。当你能提供更多的(诊断)的信息。

注意:该附加信息可能不可用在其中原始异常(IOException的)被抛出的地方。抽象的层层递进可能有更多的信息来添加像什么是你想做而导致这种异常?

II。当你不能公开的实施细则:即你要抽象的(幻觉?)继续。

这可以是重要的,当底层实现机构可以改变。在一个自定义异常包装底层的例外是从实施细则绝缘你的客户(通过提升抽象层次)的一个很好的方式。

III。 I和II

请注意:另外您的客户应该能够调成的信息,他们有兴趣或者更确切地说,他们应该能够调出任何他们不感兴趣,确切的水平所以这是从派生自定义异常是一个好主意。 IOException异常。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top