我在这里使用以下代码.
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread paramThread, Throwable paramThrowable) { // Catch your exception // Without System.exit() this will not work. System.exit(2); } });
我想在C#中使用它.但是,我无法在C#中找到这种方法的等效方法.我想用来Toast.makeText()
向用户显示错误.
尝试这样的事情 -
AppDomain.CurrentDomain.UnhandledException +=; TaskScheduler.UnobservedTaskException += ;
理想情况下,您希望在执行程序期间执行不超过一次的某个位置执行此操作.如果是Xamarin.Android应用程序,您可以将它放在Custom Application类onCreate
方法中.
如果你想要一个代码示例,请检查此链接(我自己没有运行代码,因此无法保证其正确性.仅用作参考) - 示例
// In MainActivity protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException; TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException; Xamarin.Forms.Forms.Init(this, bundle); DisplayCrashReport(); var app = new App(); LoadApplication(app); } ?#?region? Error handling private static void TaskSchedulerOnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs unobservedTaskExceptionEventArgs) { var newExc = new Exception("TaskSchedulerOnUnobservedTaskException", unobservedTaskExceptionEventArgs.Exception); LogUnhandledException(newExc); } private static void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs) { var newExc = new Exception("CurrentDomainOnUnhandledException", unhandledExceptionEventArgs.ExceptionObject as Exception); LogUnhandledException(newExc); } internal static void LogUnhandledException(Exception exception) { try { const string errorFileName = "Fatal.log"; var libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // iOS: Environment.SpecialFolder.Resources var errorFilePath = Path.Combine(libraryPath, errorFileName); var errorMessage = String.Format("Time: {0}\r\nError: Unhandled Exception\r\n{1}", DateTime.Now, exception.ToString()); File.WriteAllText(errorFilePath, errorMessage); // Log to Android Device Logging. Android.Util.Log.Error("Crash Report", errorMessage); } catch { // just suppress any error logging exceptions } } ///// If there is an unhandled exception, the exception information is diplayed // on screen the next time the app is started (only in debug configuration) /// [Conditional("DEBUG")] private void DisplayCrashReport() { const string errorFilename = "Fatal.log"; var libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); var errorFilePath = Path.Combine(libraryPath, errorFilename); if (!File.Exists(errorFilePath)) { return; } var errorText = File.ReadAllText(errorFilePath); new AlertDialog.Builder(this) .SetPositiveButton("Clear", (sender, args) => { File.Delete(errorFilePath); }) .SetNegativeButton("Close", (sender, args) => { // User pressed Close. }) .SetMessage(errorText) .SetTitle("Crash Report") .Show(); } ?#?endregion? //iOS: Different than Android. Must be in FinishedLaunching, not in Main. // In AppDelegate public override bool FinishedLaunching(UIApplication uiApplication, NSDictionary options) { AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException; TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException; ... } ///// If there is an unhandled exception, the exception information is diplayed // on screen the next time the app is started (only in debug configuration) /// [Conditional("DEBUG")] private static void DisplayCrashReport() { const string errorFilename = "Fatal.log"; var libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Resources); var errorFilePath = Path.Combine(libraryPath, errorFilename); if (!File.Exists(errorFilePath)) { return; } var errorText = File.ReadAllText(errorFilePath); var alertView = new UIAlertView("Crash Report", errorText, null, "Close", "Clear") { UserInteractionEnabled = true }; alertView.Clicked += (sender, args) => { if (args.ButtonIndex != 0) { File.Delete(errorFilePath); } }; alertView.Show(); }