Ale*_*akh 14 android exception-handling unhandled-exception xamarin.android xamarin
我正在尝试在我的monodroid应用程序中实现有效的异常处理,该应用程序是用Visual Studio的Xamarin.Android插件编写的.
我正在尝试处理两种类型的异常:
在全局处理程序的两种情况下,我想:
经过一定的调查后,我在这里和这里找到了一些答案,但除了AndroidEnvironment.UnhandledExceptionRaiser和AppDomain.UnhandledException之外什么都没有提出,它并不适用于所有情况.
我创建了一个简短的示例,我试图使用这两个处理程序:
AppDomain.CurrentDomain.UnhandledException += (s,e)=>
{
System.Diagnostics.Debug.WriteLine("AppDomain.CurrentDomain.UnhandledException: {0}. IsTerminating: {1}", e.ExceptionObject, e.IsTerminating);
};
AndroidEnvironment.UnhandledExceptionRaiser += (s, e) =>
{
System.Diagnostics.Debug.WriteLine("AndroidEnvironment.UnhandledExceptionRaiser: {0}. IsTerminating: {1}", e.Exception, e.Handled);
e.Handled = true;
};
Run Code Online (Sandbox Code Playgroud)
然后在按钮单击时,我添加了以下代码以引发两种类型的异常:
//foreground exception
throw new NullReferenceException("test nre from ui thread.");
//background exception
ThreadPool.QueueUserWorkItem(unused =>
{
throw new NullReferenceException("test nre from back thread.");
});
Run Code Online (Sandbox Code Playgroud)
因此,我对两种类型的异常都有不同的行为:
在我的情况下,我无法在try-catch中包装每个用户操作,尤其是后台任务.我有业务登录,如果出现错误应该被中断,这正是我对运行时的期望.同时我想在一个地方的顶层处理这些异常,记录它们(根据我的业务规则)并继续执行应用程序.
如何处理这两个异常并仍然能够使应用程序保持活动状态(防止崩溃).
您可以在此处找到完整的代码示例:https: //dl.dropboxusercontent.com/u/19503836/UnhandledException.zip
感谢您的意见.任何帮助赞赏.TIA!
这些事件处理程序并非旨在让您从异常中恢复,它们是最后的手段,可以让您在应用程序终止之前执行类似写入错误日志的操作.
您已经提到要记录错误 - 这应该可以正常工作,但是可能无法向用户显示错误,因为您的应用程序已达到甚至无法执行此操作的程度.
正如您对问题的评论所提到的,处理这样的异常是一个坏主意.
虽然您可能对何时调用此函数有非常具体的期望,但您的应用程序可能会在任何时候抛出异常 - 无论出于何种原因.它是不可能设计它,以便它正确处理一切.
即使您可以安全地编写一些内容来处理任何异常,您的应用程序仍会因未处理的异常而终止.
AppDomain.CurrentDomain.UnhandledException的Microsoft文档提供了有关此内容的更多信息:
http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx
归档时间: |
|
查看次数: |
5667 次 |
最近记录: |