java - 处理 Swing UI 中的异常(低级到高级以及异常包装)

标签 java swing exception

我希望在 Swing 应用程序中以有意义的方式处理异常。

以下内容位于 actionPerformed 方法内。 UiUtils#showError 显示一个 JOptionPane,其中包含一个显示/隐藏堆栈跟踪的按钮。 ApplicationException 是一个自定义类,用于将低级异常转换为用户可以理解的内容。

一个问题是,如果用户在此代码之前未在 JFileChooser 中选择文件,我不确定如何处理向上传播的 NullPointerExceptionexportData 方法有目的地检查条目是否为 null,因此不会进行文件处理。

此外,包装低级异常(例如来自数据层)似乎是一个好方法。我想修改 ApplicationException 以保留一个实例,而不是在 showError 方法中执行此操作。

最后,有一件事困扰着我,那就是一些异常可能同时发生。我不知道如何处理这个问题,所以我愿意接受任何建议。

try {
    dataService.exportData(list, selectedFile);
} catch (IOException e) {
    UiUtils.showError(new ApplicationException("Input/Ouput error"), e );
} finally {

    if( list == null){
        UiUtils.showError(new ApplicationException("No data to export"), null );
    }

    if( selectedFile == null ){
        UiUtils.showError(new ApplicationException("No file selected"), null );
    }       
}

最佳答案

要捕获 NullPointerException(或任何与此相关的 RuntimeException)以及 IOException,只需捕获最常见的异常类型:

try {
   dataService.exportData(list, selectedFile);
} catch (Exception e) {
   UiUtils.showError(new ApplicationException(e), e );
} finally {
  ...
}

您可以将原始异常包装到 ApplicationException 中,方法是将其作为“原因”参数添加到构造函数中,例如:

public class ApplicationException extends RuntimeException {

   public ApplicationException(Exception cause) {
       super(cause);
   }

   ...
}

那么原始异常将始终可以通过 getCause() 方法获得。

如果你的程序不是多线程的,我就不会担心并发异常。

关于java - 处理 Swing UI 中的异常(低级到高级以及异常包装),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5774437/

相关文章:

java - maven-jar-plugin 与 maven-source-plugin 不起作用

java - 在 JLabel 中显示多行文本

c++ - 如果传入 std::swap 的对象在交换期间抛出异常怎么办?

java - 如何验证 java 中的文本字段

python - 异常派生类的 __repr__ 效果不佳

c++ - boost::crc_32_type 会产生任何异常吗?

java - 无法在 Nativescript 和外部设备 SDK 25、Android 7.1.2 中使用 SQLite

java - 使用 Java 测试平面文件内容和格式

Java 给定整数的字符串排列

java - 检查Jlabel是否有Icon