首页 > 解决方案 > 知道何时从 Xamarin 抛出 NSException

问题描述

我有一些调用本机函数的 Xamarin.Mac 代码,如此处所述。调用该函数时,有时会引发 NSException(取决于连接的硬件)。不幸的是,使用 try/catch 没有捕获到异常,它使我的应用程序崩溃。

现在我可以忍受导致异常的情况。但是,我不能忍受我的应用程序崩溃。

我希望能够在抛出 NSException 时进行捕获,也许会报告错误并继续。

像下面这样的东西会做到这一点:

ExceptionCatcher.CatchExceptionAndGetError(
    () => _platformThing.SometimesThrowException(),
    out var error);

if (error != null)
{
    // Report error
}

// Carry on

我已经验证直接使用Objective-C时可以捕获异常。

我知道这里的 NSException 包装解决方案。但是,在尝试实现这样的东西来处理我的代码之前,是否有一些已经存在于 Xamarin 中的东西可以用来处理这种情况?

标签: objective-cxamarinxamarin.mac

解决方案


和事件Runtime.MarshalManagedExceptionRuntime.MarshalObjectiveCException用于拦截这些异常。

由于捕获这些异常不是无性能的功能,因此您必须通过构建过程(mtouch/mmp)启用它们:

  • --marshal-managed-exceptions=

    • 默认
    • 展开本机代码
    • 抛出objectiveexception
    • 中止
    • 禁用
  • --marshal-objectivec-exceptions=

    • 默认
    • 展开托管代码
    • 抛出托管异常
    • 中止
    • 禁用

Xamarin 有一个涵盖 Xamarin.iOS 和 Mac 的异常封送处理详细指南:


推荐阅读