java - 如何更好地改变java项目中处理异常的方式?

标签 java architecture 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();
    }
 }

最佳答案

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

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

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

  • 注意不要混合处理上面列出的异常的两个部分
  • 如果您正在处理已检查的异常,并且可以在调用层次结构的最底层处理它们,那么这将使您的代码比向下传递 ViewPart 更加丑陋(并且肯定会混合上面列出的两个部分)。

单元测试时遇到什么问题?

  • 如果 ViewPart 出现问题:mock it .
  • 如果将 ViewPart 作为参数传递会让您烦恼:使用一些框架进行依赖项注入(inject),例如SpringGuice .
  • 如果异常的替代可视化/处理造成麻烦:可能是 (junit-)rule解决问题了吗?

关于java - 如何更好地改变java项目中处理异常的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9720258/

相关文章:

java - 配置 log4j 发送邮件

java - 无法在任何地方调试 Junit 测试

java - Appengine Channel Api 存在 _ah/channel/connected 不工作

ios - 哪种 iOS 架构模式更好地优化代码 谁能解释一下?

java - 向应用程序添加脚本安全性

c# - 是否可以拦截第三方应用程序的 WIN32 异常?

ruby-on-rails - 如何在Ruby中设置通用错误/异常处理程序回调?

java - Weka 安装 libsvm

Swift MVVM - 使用协议(protocol)来处理 viewModel 事件

exception - Laravel 测试和纯文本异常消息