xamarin .Net Maui Android Exceptions,not bubbling up to my try,catch

am46iovg  于 2023-04-03  发布在  .NET
关注(0)|答案(1)|浏览(131)

由于Android没有冒泡我的异常,我在捕获我的异常时遇到了问题。一个简单的例子:

try
{
    var x = new Tuple<double, double>(Convert.ToDouble(xmlDeser.Cell.Latitude), Convert.ToDouble(xmlDeser.Cell.Longitude));
    return x;
}
catch (Exception ex)
{
    DisplayAlert("Help",ex.Message, "ok");
}

我没有进入catch块,而是得到了一个错误,当x被设置时,它将我的代码置于中断模式:

0xFFFFFFFFFFFFFFFF in Android.Runtime.JNIEnv.monodroid_debugger_unhandled_exception C#
0x1A in Android.Runtime.JNINativeWrapper._unhandled_exception at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:12,5 C#
0x1D in Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PP_V at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:23,26    C#
0x17 in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw    C#
0x6 in System.Threading.Tasks.Task.<>c.<ThrowAsync>b__128_0 C#
0xC in Android.App.SyncContext. at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:36,19 C#
0xE in Java.Lang.Thread.RunnableImplementor.Run at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:36,6 C#
0x8 in Java.Lang.IRunnableInvoker.n_Run at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net7.0/android-33/mcw/Java.Lang.IRunnable.cs:84,4    C#
0x8 in Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PP_V at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:22,5  C#

这就违背了try,catch块的目的。如前所述,我在之后处于中断模式,所以永远不要进入我的catch块(即使在尝试继续之后)。
我把这个标签添加到xamarin中,因为我很好奇这是否也存在于xamarin中,而且它不是特定于maui的。

c9qzyr3d

c9qzyr3d1#

我已经把你的代码放在Maui项目模板的按钮点击事件中,它将成功运行。如:

      private void OnCounterClicked(object sender, EventArgs e)
      {
            count++;

            if (count == 1)
                  CounterBtn.Text = $"Clicked {count} time";
            else
                  CounterBtn.Text = $"Clicked {count} times";

            SemanticScreenReader.Announce(CounterBtn.Text);
            try
            {
                  var x = new Tuple<double, double>(Convert.ToDouble("string1"), Convert.ToDouble("string2"));
               // var x = new Tuple<double, double>(Convert.ToDouble(new string[] {"aa","bb"}), Convert.ToDouble(new string[] { "aa", "bb" }));
            }
           catch (Exception ex)
           {
              DisplayAlert("help", ex.Message, "ok");   
           }
    }

以及结果消息:

所以原因应该是你没有在主线程上运行DisplayAlert("help", ex.Message, "ok");代码。对于android来说,所有关于UI更新的代码都必须在主线程上执行。
您可以将代码更改为:

catch (Exception ex)
{
   MainThread.BeginInvokeOnMainThread(() => {
      DisplayAlert("help", ex.Message, "ok");
   });           
}

相关问题