Java,在一个类中处理潜在的大量异常 - 处理程序类?

时间:2013-10-11 00:17:15

标签: java exception exception-handling try-catch throwable

我正在开发一个Java项目,我遇到了一个有趣的设计问题。这不是一个问题,但显而易见的解决方案有点难看。

我有一个实现Callable的类,虽然使用当前的实现它可以很容易地成为Runnable,因为我对结果不感兴趣,至少就调用线程而言。调用线程会将其中的一些丢弃到线程池中。这些Callables中的每一个都将具有从外部服务获得的一批数据。 Callables将执行许多操作,其中许多操作涉及进一步调用外部服务。因此,有很多地方可以抛出各种例外。

我发现的问题是,根据异常发生的位置,我可能需要采取不同的操作。如果它发生在A点,则删除外部服务上的数据。如果它发生在B点,请将数据移动到服务器上的其他位置。如果它发生在C点,只需记录它,什么也不做,等等。可以在多个点抛出任意数量的Exception类型,虽然我不认为我需要对类型本身进行太多过滤,但更多那个发生了。

Callable本身并不是非常庞大,因此没有大量的代码可以搞砸。但是,我犹豫是否要用大量的try / catch块来处理它,以处理可能需要不同处理的每个可能的点/异常。我意识到这可能是唯一可行的解​​决方案。我没有真正控制大部分将被抛出的异常(可能是少数)而没有捕获现有的异常并重新抛出我自己的异常,这似乎有点多余。我想知道是否有一个好的模式或方法来处理这类事情。

我已经考虑过一个异常处理类,但是我仍然需要以某种方式捕获每个异常并将其传递给处理程序,因为抛出异常的点非常重要。我可以将Callable分解为更多的原子类,每个类都有自己的小块和处理,但这将是另一个用于交换的一个kludge。在call()方法中直接捕获所有内容或者通过在调用线程中从Future获取Exception确实不是一个选项,因为这将丢失它发生的位置的数据,除非我想解析堆栈跟踪,这不是完全可行。

任何人都能解开一些光明吗?也许我只是在尝试使用try / catch块,并且应该继续使用它,但我觉得必须有更好的方法......

嗯,我确实发现方法上的注释可能对此有所帮助。我可以分解所有方法,直到每个方法中只有一个可能的异常抛出代码。使用自定义注释来注释每个注释,该注释指示当该方法抛出异常时所执行的操作。我不确定它是否可能(异常会以某种方式需要被捕获,因为它可能发生在遍历每个数据的循环中,并且只有一个部分可能有问题,或者至少以某种方式标记该部分进行处理这可能会减少对大量try / catch块的需求,而是使用单个注释和处理程序类来处理异常处理行为。我不相信用这种方式用注释来指示行为是可能的,但我很乐意在这方面做错。

0 个答案:

没有答案