拦截exception
我想使用自定义exception,以便在发生任何排序exception时出现用户友好的消息。
这样做的直接方式是什么? 我是否应采取额外的预防措施以避免干扰Swing的EDT?
例外翻译:
最好不要使用对最终用户没有意义的消息来污染您的应用程序,而是创建有意义的exception和消息,以便转换在应用程序实现的某个深处发生的exception/错误。
根据@ Romain的注释,您可以使用Exception(Throwable cause)构造函数来跟踪较低级别的exception。
从Effective Java 2nd Edition
,第61项:
[…]更高层应该捕获较低级别的exception,并且在它们的位置抛出可以用更高级别的抽象来解释的exception。 这个成语被称为exception翻译:
// Exception Translation try { // Use lower-level abstraction to do our bidding ... } catch(LowerLevelException e) { throw new HigherLevelException(...); }
您可以使用java.lang.Thread.UncaughtExceptionHandler
来捕获您自己不关心的所有exception
import java.lang.Thread.UncaughtExceptionHandler; public class MyUncaughtExceptionHandler implements UncaughtExceptionHandler { public void uncaughtException(Thread t, Throwable e) { Frame.showError("Titel", "Description", e, Level.WARNING); e.printStackTrace(); } }
在您的应用中注册:
public static void main(String[] args) { Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler()); }
在您的GUI中,您可以使用SwingX中的org.jdesktop.swingx.JXErrorPane来显示一个很好的错误弹出窗口,它会通知用户有关exception的信息。
public static void showError(String title, String desc, Throwable e, Level level) { JXErrorPane.showDialog(this, new ErrorInfo(title, desc, null, null, e, level, null)); }
- 未捕获的exception处理程序中未捕获的exception
- 仅当没有Exception的映射时,才会调用@ExceptionHandler for Error
- 显示SQL错误消息
- 如何捕获事件调度线程(EDT)exception?
- 您在Java中如何以及在何处定义自己的Exception层次结构?
- 块捕获中的丢失exception
- 如何在Clojure中捕获多个exception?
- 您是否针对特定问题或一般例外编写例外情况?
- 为什么我的applet得到java.security.AccessControlException:访问被拒绝(java.net.SocketPermission …),我该如何避免它?