Xamarin Forms iOS C# catch异常不工作

r1zk6ea1  于 12个月前  发布在  iOS
关注(0)|答案(1)|浏览(137)

我有一个在iOS上运行的Xamarin Forms应用程序,它使用iOS LocationManager来获取用户的位置。
有一些随机的时间,这是不工作的,但不是代码击中我的try / catch异常块,它抛出SIGABRT System. InvalidOperationException。
我想我碰到了下面这篇关于iOS异常封送处理的文章中列出的一个问题,但我不完全理解这篇文章,也没有看到文章中除了使用构建时标志之外的解决方案,但即使这样也很混乱,因为我不知道应该使用哪些标志。
我想我需要将iOS的C#异常转换为带有标志的C#异常,但不确定使用哪个标志。
https://learn.microsoft.com/en-us/xamarin/ios/platform/exception-marshaling
下面是我在iOS中使用的代码块,我想知道如何在出现错误时捕获异常并返回“null”,而不是使应用程序崩溃。

try
{
    using (cancellationTokenSource.Token.Register(() => taskCompletionSource.SetCanceled(), useSynchronizationContext: false))
    {
        // request the current location
        locationManager.RequestLocation();

        // return the task to the caller
        return await taskCompletionSource.Task.ConfigureAwait(continueOnCapturedContext: false);
    }
}
catch (Exception)
{
    // LOG THE EXCEPTION

    // return null so we don't blow up the calling code for now.
    return null;
}
finally
{
    // remove the attached handler
    locationManager.LocationsUpdated -= handler;

    locationManager.Dispose();
}

字符串
下面是它发送给我的堆栈跟踪。
TaskCompletionSource`1[TResult].SetCanceled()LocationService+<>c__DisplayClass9_0.b__1()<.cctor>b__26_0(System.Object obj)CancellationCallbackInfo.ExecutionContextCallback(System.Object obj)ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,System.Object state,System.Boolean BullaveSyncCtx)ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback回调,System.Object状态,系统.布尔值(System.Boolean)执行上下文.运行(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback回调,System.Object state)CancellationCallbackInfo.ExecuteCallback()CancellationTokenSource.CancellationCallbackCoreWork(System.Threading.CancellationCallbackCoreWorkArguments args)CancellationTokenSource.ExecuteCallbackHandlers(System.Boolean throwOnFirstException)
CancellationTokenSource.ExecuteCallbackHandlers(System.Boolean throwOnFirstException)CancellationTokenSource.NotifyCancellation(System.Boolean throwOnFirstException)CancellationTokenSource.TimerCallbackLogic(System.Object obj)Timer+ TimerCB(System.Object o)IThreadPoolWorkItem.ExecuteWorkItem()ThreadPoolWorkQueue.Dispatch()
在我的iOS AppDelegate.cs中,我有AppDomain.CurrentDomain.UnhandledException事件处理程序,但在上面的代码中也没有命中。
记录异常而不是崩溃应用程序会更好。

o75abkj4

o75abkj41#

AppDomain.CurrentDomain.UnhandledException未被调用的问题显然是bug
Bug项目中提到了一个解决方法,可以调用该事件:

ObjCRuntime.Runtime.MarshalManagedException += (_, exceptionArgs) =>
{
    exceptionArgs.ExceptionMode = ObjCRuntime.MarshalManagedExceptionMode.UnwindNativeCode;
};

字符串
YMMV.

相关问题