我希望在 Swing 应用程序中以有意义的方式处理异常。
以下内容位于 actionPerformed
方法内。 UiUtils#showError
显示一个 JOptionPane,其中包含一个显示/隐藏堆栈跟踪的按钮。 ApplicationException 是一个自定义类,用于将低级异常转换为用户可以理解的内容。
一个问题是,如果用户在此代码之前未在 JFileChooser
中选择文件,我不确定如何处理向上传播的 NullPointerException
。 exportData
方法有目的地检查条目是否为 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/