如何以更好的方式更改我的java项目中处理异常的方式?

kei*_*bel 2 java architecture exception-handling exception eclipse-rcp

我必须重构使用Eclipse RCP创建的Java程序.我的前任通过几次调用向我要编写单元测试的类调用ViewPart实现.ViewPart是为了异常处理目的而移交的.每次发生错误时,错误消息都将写入ViewPart的StatusLineManager.

我现在要做的是改变这个异常处理过程,因为当我想进行单元测试时,它会给我带来很多问题.

有没有办法将这些异常传递给ViewPart而不将其交给多个方法调用?

我最初的想法是创建某种ExceptionMessenger类,每次发生异常时都会对其进行初始化.但我找不到一种方法来访问ViewPart.

编辑 代码示例:

class A {
    void func() {
         B.funcB(arg, arg1, arg2, ViewPart view):
    }
}

class B {
      void funcB(arg, arg1, arg2, ViewPart view) {
           C.funcC(arg, arg1, ViewPart view);
      }
}

class C {
    void funcC(arg, arg1, ViewPart view) {
        try{
             doSomeThing():
        catch(Exception e) {
            doSomeErrorMessages(e, view);
        }
     }

    void doSomeErrorMessages(e, ViewPart view) {
        SomeOtherClass.writeToStatusLine( StatusCategory.Processing, e.getMessage(), view); 
    }
 }

class SomeOtherClass {
    void writeToStatusLine(final StatusCategory category, final String message, final ViewPart view) {
    IActionBars bars = view.getViewSite().getActionBars();
        IStatusLineManager statusLineManagerRef = bars.getStatusLineManager();
        statusLineManagerRef.setErrorMessage(null); // clear any error msg

        doWhatEver();
    }
 }
Run Code Online (Sandbox Code Playgroud)

Dav*_*Far 5

如果我正确地理解了您的任务,那么您需要处理异常的两个部分:

  • 发生某些异常行为时Java的异常处理.为此,您应该坚持Java为您提供的内容,例如,在Josh Bloch的Effective Java,第57项(仅针对特殊情况使用例外)中所述.
  • 可视化工具中的异常(by ViewPart).由于这不是恢复或以其他方式处理异常情况的异常处理的一部分,因此我故意不使用Java的异常处理,即避免滥用控制流的异常处理.因此,我认为您的前任设计传递ViewPart给然后将Exceptions作为参数传递给您ViewPart是好的.

另一种方法是让异常向上抛出,然后在层/框架的某个合理边界处进行可视化.但

  • 注意不要混淆处理上面列出的例外的两个部分
  • 如果你正在处理已检查的异常并且可以在你的调用层次结构中处理它们,这将使你的代码比传递下来更加丑陋ViewPart(并且肯定混合了上面列出的两个部分).

单元测试时你有什么问题?

  • 如果ViewPart遇到麻烦:嘲笑它.
  • 如果将ViewPart作为参数传递给你烦恼:使用一些框架进行依赖注入,例如SpringGuice.
  • 如果异常的替代可视化/处理正在制造麻烦:(junit-)规则是否可以解决问题?