[英]Handling exceptions in a Swing UI (low level to high level and exception wrapping)
我希望在Swing应用程序中以有意义的方式处理异常。
以下是actionPerformed
方法内部。 UiUtils#showError
显示一个JOptionPane以及一个显示/隐藏堆栈跟踪的按钮。 ApplicationException是一个自定义类,用于将低级异常转换为用户可以理解的内容。
一个问题是,如果用户在此代码之前未在JFileChooser
选择文件,我不确定如何处理传播到上方的NullPointerException
。 exportData
方法有目的地检查输入是否为null,因此不进行任何文件处理。
同样,包装低级别的Exception
(例如,从数据层)似乎是一个好方法。 我想修改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()方法获得。
如果您的程序不是多线程的,那么我不会担心同时发生异常。
作为参考, 事件分发线程上没有“同时”发生任何事情; EventQueue
强制执行此操作。 此外,秋千重启EDT上捕获的异常,但您可以替换自己的处理程序,如图所示这里 。
附录:@Sasha O直接帮助解决了这个问题。 或者,如果您可以安排永不使用null
文件句柄来调用该方法,则可以将该事实assert
为前提。 有关详细信息,请参见使用断言编程 。
这让我想知道在什么情况下应该在方法调用之前或方法内部检查输入。
在很大程度上取决于设计。 禁用受影响的控件,直到选择了有效的文件,而不是处理“未选择文件”。 在选择器对话框中,按类型,大小或内容过滤文件,而不是处理“没有要导出的数据”。 您仍然必须处理I / O错误,但这是不可避免的,因为它们在程序外部。
附录:提出了帮助用户理解为什么禁用控件的问题。 某些应用程序使用状态栏显示此类信息。 工具提示可以帮助,如在这里 ,即使是禁用的控制。
你不应该用断言检查的公共方法的参数。
用户不理解异常,但是您可以很好地覆盖或分层它们;-)以没有对象的方式设计每个最终用户目标应用程序。 并且请记住,例外是针对..很好..例外状态的,仅此而已。
Fi,空选择是ui的一种完全有效的状态,它允许选择某些内容(并对所选项目执行操作)。 如果对空选择的操作像NPE一样冒泡,则操作逻辑不正确-它必须处理任何有效状态。 一种应对方法可能是禁用(如已经建议的垃圾桶),另一种可能是在没有选择任何内容的情况下显示警告标签。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.