【问题标题】:Struggling to understand Xamarin exception handling努力理解 Xamarin 异常处理
【发布时间】:2014-11-25 04:36:30
【问题描述】:

我在网上爬了很长时间,希望有一个解决方案,我遇到了很多答案,但似乎都没有达到我想要的。

我正在尝试在不导致应用崩溃的情况下处理异常。与其简单地退出应用程序,我更愿意捕获异常,向用户显示更用户友好的错误(可能是消息框警告)并允许他们继续在应用程序中操作。

是否可以阻止应用程序退出?

我目前试图捕捉到的方式如下:

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,也是我第一次开发移动应用程序,如果我对任何事情一无所知,我深表歉意。

请帮忙!!!

【问题讨论】:

    标签: c# android mobile mono xamarin


    【解决方案1】:

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

    另外,我会将事件订阅移至 Application 类,但这是个人喜好。 像这样:

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

    【讨论】:

    • 谢谢亚历克斯。欣赏回应。你能给我推荐一两个报告组件吗?您能否抽出一点时间详细说明如何使用 Application 类和您在整个应用程序中使用的基本类结构?谢谢!
    • 组件是 HockeyApp 和 Raygun(是我使用的)。 components.xamarin.com/gettingstarted/hockeyappandroid components.xamarin.com/view/raygun4net 至于 Application 类,请参阅我编辑的答案。
    • 谢谢亚历克斯,我一定会去看看。那么一般概念是创建一个应用程序类,然后每个活动都实现应用程序类吗?抱歉 - Xamarin/移动开发新手!
    • 天哪,不 :) 我建议你不要把我对 Application 类的评论从字面上看,你的方法也很好,我只是觉得把它集中在 one 类对我来说更直观。至于你的问题,你只在一个单独的类中实现 Application 类一次,你的活动不受它的影响,你一直从你的基类继承,就像你到目前为止所做的那样。以下是有关 Application 类的一些阅读材料:intridea.com/blog/2011/5/24/…
    • 所以这是xamarin平台的一个缺陷。在我看来,没有什么意外的例外。所有异常都是意外的,否则它们将成为主要流程的一部分。任何平台上的任何软件应用程序都应该能够拦截任何场景并按照它认为合适的方式进行处理。如果应用程序不稳定并且必须关闭,那么应用程序应该能够传达该消息并可能提供支持信息。如果平台不提供此功能,则这是设计缺陷/错误,应采用变通方法。
    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多