我该如何清理exception处理?

我正在寻找清理目前我正在处理的代码库的exception混乱。

基本设置是这样的。

我有一个接口,由很多类实现,如下所示:

public interface TerminalMessage { // Override for specific return data type. public E send(TerminalStream stream) throws Exception; } 

这些类抛出了许多不同的exception,如IOException,InterruptedException等。

就像现在一样,我所做的只是在捕获的exception上调用getMessage()并将此消息转发给ui-code。

这不是很好,因为我有时会向用户显示伪造的消息,并且我会捕获不必要的exception。

我正在考虑创建一个自定义exception类(TerminalException)来包装所有这些exception。

但是我不知道在哪里进行包装,是否应该在首次抛出exception(例如在输出流中)或每个send()方法中完成包装。 前者的优点是不添加太多代码,但是对我来说更有意义的是流抛出IOException而不是TerminalException。

上面的设计也没有真正解决显示给用户的有时不好的消息,所以一些提示如何将抛出的exception转换为对用户有用的东西会很棒!

谢谢!

如果你有一个有用的信息,如错误代码,自定义exception是一个非常好的主意。

用您的TerminalException包装所有内容,但不要忘记原因

要么

使用抛出的第一个TerminalException:

 public class MyException extends Exception{ String errorMessage; public MyException(String message, Exception cause){ super(); if(cause instanceof MyException){ // already wrapped errorMessage= cause.getErrorMessage(); initCause(cause.getCause()); } else{ // not my Exception errorMessage=message; initCause(cause); } ´ } } 

另一个选择可能是使用模板方法设计模式并“控制”其中的exeptions如下:

 public abstract TerminalMessage { public abstract E doSend(TerminalStream stream); public E send(TerminalStream stream) throws Exception { // do common stuff here try { doSend(stream); } // catch more specific exceptions first // handle all the exceptions accordingly here, thus controlling // in one central location what will be thrown externally catch(Exception) { } } } 

这样,所有派生类的exception处理将是相同的并且是本地化的,派生类不必执行任何特殊操作。

从我尝试的许多设计中,这是我在一些项目中愉快地使用的最后一个。

  public enum ExceptionCodes { IOException("ioexception", false), UserNotFound("usernotfond", true); private static final String BUNDLE_NAME = "SOME_bundle_name"; private final String bundleCode; private final String isManagable; ExceptionCodes(String bundleCode, String isManagable) { this. ... ... } public String message() { // eventually get locale from somewhere, for example some threadLocal return SomeBundleResolver.resolve(BUMDLE_NAME, bundleCode); } public Boolean isManagable() { return isManagable; } } public class MyGenericException extends RuntimeException { private final ExceptionCodes exceptionCode; private final Throwable throwable; public MyException(ExceptionCodes exceptionCode) { this.... ... } public MyException(ExceptionCodes exceptionCode, Throwable throwable) { this. ... .... } public Boolean isManagable() { return exceptionCode.isManagable(); } public String getMessage() { return (throwable == null) ? super.getMessage() : throwable.getMessage(); } ... } 

重点是exception代码在一个地方进行管理。 您可以将自定义属性添加到枚举中,例如错误代码等。例外的许多问题之一是,如果您不知道如何处理exception,那么您将无法理解如何处理上面的exception层。 然后只会发生两种情况。 这两种exception都可以以某种格式显示给用户,或者系统必须以一种优雅的方式崩溃。 属性isManagable就是这个。 如果exception不可管理的系统必须下降。 因此,exception仅在一般error handling程序中的顶级应用程序处理。 这样就可以防止exception爆炸。