苦苦挣扎,了解Xamarin异常处理

时间:2014-11-25 04:36:30

标签: c# android mobile mono xamarin

我一直在爬上互联网很长一段时间,希望找到一个解决方案,而且我遇到了很多答案,但这些都没有达到我想要的目的。

我正在尝试处理异常而不会导致应用崩溃。而不是应用程序只是退出,我宁愿捕获异常,向用户呈现更加用户友好的错误(可能是消息框警告),并允许他们继续在应用程序中操作。

是否可以阻止应用程序纾困?

我目前试图抓住这个的方式如下:

public class Login : Activity
{
    int count = 1;
    Session mySession;

   protected override void OnCreate(Bundle bundle)
    {
        AndroidEnvironment.UnhandledExceptionRaiser += HandleAndroidException;

            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Login);


            Button button = FindViewById<Button>(Resource.Id.Login);
            string accountCode = Resource.Id.AccountCode.ToString();
            string password = Resource.Id.Password.ToString();

            // button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };
            button.Click += delegate
            {
                    throw new Exception("LETS THROW A RANDOM EXCEPTION");

            };

    }


    void HandleAndroidException(object sender, RaiseThrowableEventArgs e)
    {
        Log.Error("INTERNAL DEBUG", "PLEASE HANDLE MY EXCEPTION!");
        e.Handled = true;
        System.Console.Write("YOU'VE JUST BEEN HANDLED!");
    }
}

正如您所看到的,我正在抛出一个常规异常并尝试使用UnhandledExceptionRaiser来捕获它。我用它作为参考:http://androidapi.xamarin.com/index.aspx?link=E%3AAndroid.Runtime.AndroidEnvironment.UnhandledExceptionRaiser

我可以在“Android设备日志记录”工具中找到我的消息,但是在发生未处理的异常错误后会触发它。我认为这意味着Xamarin内部的一些东西在异常处有第一次破解并且摔倒了。当然必须有办法阻止这个??

我在网上看过无数的例子,人们一直在问类似的问题而且没有明确的解决方案。有些人提供了一些解决方案,但实际上并没有达到我的预期。

如果无法做到这一点,那对我来说是难以置信的。

这是我第一次使用Xamarin,也是我第一次开发移动应用程序,所以如果我对任何事情一无所知,我会道歉。

请帮助!!!

1 个答案:

答案 0 :(得分:10)

在Android中有一个重要的事情需要了解Unhandled异常的性质,在Android框架中没有一个....使用Java它是一个Uncaught异常意味着你不能像在.Net环境中那样“处理”或从中恢复。 Xamarin(Mono)在内部“处理”那些未捕获的异常,通过try-catch包围字面上的所有内容并引发Unhandled事件,但这不仅仅是重点。由于各种原因,也不鼓励与UI交互。 从理论上讲,有几个“解决方法”用于向用户显示对话框或重新启动应用程序,我建议不要这样做。相反,您应该使用try-catch子句来处理敏感区域以处理预期的异常,因为意外的人只需使用异常报告组件并在分析报告的异常后更新您的应用程序。

此外,我会将活动订阅移至Application课程,但这是个人偏好。 像这样:

public class YourAppClass : Application
{
    public override void OnCreate()
    {
        AndroidEnvironment.UnhandledExceptionRaiser += HandleAndroidException;
    }
}