所以我的问题是:使用VS 2012或VS 2010和模拟器开发Android时,这是正常的行为吗?有没有办法以“正常方式”查看抛出的异常,而不仅仅是在输出窗口中.如果我使用实际的Android设备进行调试,会改变吗?
解决方法
为什么?
There is one important thing you have to understand about the nature
of an Unhandled exception in Android,there isn’t one…. in Android
it’s an Uncaught exception which means you can’t “handle” it or
recover from it like you maybe would in a .Net environment.Xamarin(Mono) internally “handles” those uncaught exceptions by
surrounding literally everything with try-catch and raising the
Unhandled event but that is besides the point. It is also discouraged
to interact with the UI as well for varIoUs reasons.Theoretically there are several “workarounds” for displaying a dialog
to the user or restarting the app,none of which I’d recommend on
doing. Instead you should surround sensitive areas with try-catch
clauses to handle expected exceptions,as for the unexpected one’s
just use an exception reporting component and update your app after
analyzing the reported exceptions
解释From
你也可以从应用程序中捕获未加扰的异常
创建名称ErrorActivity等基本活动
看看这个例子
protected override void OnCreate(Bundle bundle) { //register error handlers AppDomain.CurrentDomain.UnhandledException += ErrorHandler.CurrentDomainOnUnhandledException; TaskScheduler.UnobservedTaskException += ErrorHandler.TaskSchedulerOnUnobservedTaskException; }
在错误处理程序类中
public static class ErrorHandler { /// <summary> /// Tasks the scheduler on unobserved task exception. /// </summary> /// <param name="sender">The sender.</param> /// <param name="unobservedTaskExceptionEventArgs"> /// The <see cref="UnobservedTaskExceptionEventArgs" /> instance containing /// the event data. /// </param> public static void TaskSchedulerOnUnobservedTaskException(object sender,UnobservedTaskExceptionEventArgs unobservedTaskExceptionEventArgs) { var newExc = new Exception("TaskSchedulerOnUnobservedTaskException",unobservedTaskExceptionEventArgs.Exception); LogUnhandledException(newExc); } /// <summary> /// Currents the domain on unhandled exception. /// </summary> /// <param name="sender">The sender.</param> /// <param name="unhandledExceptionEventArgs"> /// The <see cref="UnhandledExceptionEventArgs" /> instance containing the event /// data. /// </param> public static void CurrentDomainOnUnhandledException(object sender,UnhandledExceptionEventArgs unhandledExceptionEventArgs) { var newExc = new Exception("CurrentDomainOnUnhandledException",unhandledExceptionEventArgs.ExceptionObject as Exception); LogUnhandledException(newExc); } /// <summary> /// Logs the unhandled exception. /// </summary> /// <param name="exception">The exception.</param> internal static void LogUnhandledException(Exception exception) { try { string error = $"Exception Caught:{DateTime.Now:F} The Error Message IS {exception.Message}\n\r full stack trace is {exception.ToString()} "; #if DEBUG const string errorFileName = "errorlog.txt"; var libraryPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); // iOS: Environment.SpecialFolder.Resources var errorFilePath = System.IO.Path.Combine(libraryPath,errorFileName); System.IO.File.WriteAllText(errorFilePath,error); Android.Util.Log.Error("Crash Report error not handled",ex.ToString()); #else // Log to Android Device Logging. Android.Util.Log.Error("Crash Report",error); #endif } catch (Exception ex) { Android.Util.Log.Error("Crash Report error not handled",ex.ToString()); // just suppress any error logging exceptions } } }
现在你可以像这样继承ErrorActivity的所有活动
Public class Fooactivity:ErrorActivity { }