Знать, когда исключение NSException выбрасывается из Xamarin - PullRequest
0 голосов
/ 14 октября 2019

У меня есть некоторый код Xamarin.Mac, который вызывает собственную функцию , как описано здесь . Когда функция вызывается, она иногда вызывает исключение NSException (зависит от подключенного оборудования). К сожалению, исключение не перехватывается при использовании try / catch, и это приводит к сбою моего приложения.

Пока я могу жить с обстоятельствами, которые приводят к исключению. Однако я не могу смириться с тем, что мое приложение перестало работать.

Я хочу иметь возможность перехватывать при возникновении исключения NSEx, возможно, сообщить об ошибке и продолжить.

Это может сделать что-то вроде следующего:

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

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

// Carry on

Я проверил, что исключение может быть перехвачено при непосредственном использовании Objective-C.

Мне известно о решении обёртывания NSException здесь . Однако, прежде чем пытаться реализовать что-то подобное для работы с моим кодом, есть ли что-то, что уже существует для Xamarin, которое я могу использовать для решения этой ситуации?

1 Ответ

1 голос
/ 14 октября 2019

События Runtime.MarshalManagedException и Runtime.MarshalObjectiveCException могут использоваться для перехвата этих исключений.

Поскольку захват этих исключений не является функциями, не обеспечивающими производительность, их необходимо включить в процессе сборки (mtouch / mmp):

  • --marshal-managed-exceptions=

    • по умолчанию
    • код развёртки
    • throwobjectivecexception
    • прервать
    • отключить
  • --marshal-objectivec-exceptions=

    • по умолчанию
    • unwindmanagedcode
    • throwmanagedexception
    • abort
    • отключить

Xamarin имеет подробное руководство по исключительной маршализации, которое охватывает как Xamarin.iOS, так и Mac:

...