Xamarin按钮点击处理异常

本文关键字:处理 异常 按钮 Xamarin | 更新日期: 2023-09-27 18:29:26

我第一次使用Xamarin,现在仍在掌握一些基础知识。

请参阅下面的示例

    protected override void OnCreate(Bundle bundle)
    {
        try
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Login);
            Button button = FindViewById<Button>(Resource.Id.Login);
            button.Click += delegate
            {
                   throw new Exception("button exception");
            };
        }
        catch(Exception e)
        {
        }
}

为了开门见山,我简化了上面的代码。

我正在为我的活动内部设置一些通用的错误处理,例如,我在单击按钮时抛出了一个异常。尽管这被包装在try/catch中,但异常仍被作为"未处理的异常"抛出。

希望有人能解释这个代码是如何逻辑运行的,我假设这是某种线程问题?我该如何最好地处理这种情况?

最终目标是,我希望打一些内部电话登录;返回任何错误消息,然后用消息框将其弹出。不幸的是,我似乎没能抓住他们。

谢谢。

我试着用以下代码设置一个全局处理程序:

   protected override void OnCreate(Bundle bundle)
    {
        try
        {
            AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
            base.OnCreate(bundle);
            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
            {
                 throw new Exception("Invalid account code or password. Please try again.");
            };
        }
        catch(Exception e)
        {
        }
    }
    static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine(e.ExceptionObject.ToString());
        Console.WriteLine("Press Enter to continue");
        Console.ReadLine();
        throw new Exception("AH HA!");
    }

Xamarin按钮点击处理异常

这样的东西应该可以工作:

button.Click += (sender, event) =>
{
    try
    {
       throw new Exception("button exception");
    }
    catch(Exception ex)
    {
    }
};

基本上,try/catch在委托中执行(此处我已将其更改为lambda)。如果您要有一个长时间运行的进程,请考虑使其异步/等待兼容:

button.Click += async (sender, event) =>
{
    try
    {
       throw new Exception("button exception");
    }
    catch(Exception ex)
    {
    }
};

这是因为您的catch的作用域仅限于OnCreate方法,它将捕获此方法内部抛出的异常。您的点击处理程序是在OnCreate方法之外调用的,因此您的catch在那里不起作用。

作为可能的解决方案,请看这里:控制台应用程序中的.NET全局异常处理程序