0

我正在处理一个 Java 项目,并且遇到了一个有趣的设计问题。这不完全是一个问题,但明显的解决方案有点难看。

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

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

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

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

任何人都可以解释一下吗?也许我只是对 try/catch 块争论不休,应该继续它,但我觉得必须有更好的方法......

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

4

0 回答 0