如何检测应用程序中何处抛出异常?
每当我的Java桌面应用程序中的任何地方抛出异常时,我都会尝试自动向我发送电子邮件.我这样想,我可以更积极主动.
我知道我可以在发生异常时明确地记录并通知我自己,但我必须在任何地方都这样做,我可能(更有可能)会错过一对.
有什么建议?
我正在使用一个名为MyExceptionHandlerimplements 的类Thread.UncaughtExceptionHandler来处理我的项目中的正常异常.
据我所知,这个类无法捕获EDT异常,所以我尝试在main()方法中使用它来处理EDT异常:
public static void main( final String[] args ) {
Thread.setDefaultUncaughtExceptionHandler( new MyExceptionHandler() ); // Handle normal exceptions
System.setProperty( "sun.awt.exception.handler",MyExceptionHandler.class.getName()); // Handle EDT exceptions
SwingUtilities.invokeLater(new Runnable() { // Execute some code in the EDT.
public void run() {
JFrame myFrame = new JFrame();
myFrame.setVisible( true );
}
});
}
Run Code Online (Sandbox Code Playgroud)
但直到现在它还没有用.例如,在初始化JFrame时,我从构造函数中的bundle文件加载其标签,如下所示:
setTitle( bundle.getString( "MyJFrame.title" ) );
Run Code Online (Sandbox Code Playgroud)
我MyJFrame.title从bundle文件中删除了密钥以测试异常处理程序,但它不起作用!例外通常打印在日志中.
我在这里做错了吗?
我正在开发一个Swing应用程序,其中包含执行自定义绘制的组件 当我在绘制代码中犯了一些错误并抛出异常时,情况很难调试.弹出窗口显示异常信息,而不是被调试器捕获.此外,线程似乎重新启动,并且由于编码错误的结果异常,它会一次又一次地显示.
当我很幸运地切换到调试器时(这很困难,因为越来越多的弹出窗口随着应用程序获取绘制请求而不断出现),调试控制台会向我显示异常信息,例如:
严重:线程中抛出未捕获的异常[AWT-EventQueue-0,6,main]
....堆栈如下
我的应用程序是用Scala编写的,我使用的是IntelliJ IDEA 14.我的未被捕获的主线程异常由调试器处理得很好(我已Uncaught exception启用Any exception断点启用Java Exception Breakpoints),但AWT线程中的异常不是.
我已经尝试过安装一个处理程序,如下所述我如何检测Java中全局抛出异常的时间?回答,但我的处理程序似乎没有被触发.
我想实现以下(按重要性顺序):
(注意:虽然这是Scala应用程序,但我认为Java的行为是相同的,因此Java标记).