(编辑:这个问题特别关于BB,因为它优化异常的奇怪方式。我对J2SE中的正常异常处理模式感到满意,但BB不按照正常情况运行。特别是在这种情况下,BB丢弃了错误类型和消息,以及BB开发者如何尝试处理此问题,或者他们是否忽略它。)
我想在我的BB应用程序中实现某种形式的自定义全局错误处理。特别是尝试处理我的代码未捕获的任何其他异常,因为我没有预料到它们。默认行为是应用程序失败,并弹出一个对话框,说明发生了未知错误。
我想更好地描述错误,因此我的术语是“全局错误处理程序”。与代码类似的东西:
public static void main(String[] args)
{
try
{
FusionApp app = FusionApp.getInstance();
app.enterEventDispatcher();
}
catch (Throwable t)
{
// t has lost all type information at this point - this prints "null"
System.err.println(t.getMessage());
}
}
我当前的问题是,当我抓住t
时(在main()
调用之后的app.enterEventDispatcher()
方法中),它已丢失其类型信息。例如我知道代码会抛出一个带有自定义消息的IllegalArgumentException
- 但是在catch块中,它是带有java.lang.Error
消息的null
。
在堆栈跟踪(ALT LGLG)中,消息也已丢失(至少堆栈跟踪是准确的)。
那么......在BB上实现某种形式的全局错误处理有什么好的模式?或者这在这个平台上被认为是个坏主意?
只是弹出未知错误对话框是不错的做法 - 我不喜欢这个,但也许这就是BB的方式?
答案 0 :(得分:0)
最佳做法是实现自定义异常处理。
所以,如果你希望捕获IllegalArgumentException,MyCustomException和StartupException,先将它们放入catch块,然后放入一个Exception catch(然后,如果你愿意的话,放一个Throwable catch)
共同规则是 - 从最独特到最常见,以及同一级别的例外 - 从最期望到最不期望。
如果异常== null或getMessage()== null,您总是可以显示“应用程序错误,请将事件日志发送到[支持电子邮件]”消息,然后如果您有一个很好的事件登录到您的应用程序,你很有可能重现一个问题。
谈论事件日志,请参阅EventLogger类以实现日志记录。