Использование NSSetUncaughtExceptionHandler в Swift 4 - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь использовать глобальную обработку ошибок в моем проекте следующим образом:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    NSSetUncaughtExceptionHandler { (exception) in
        print(exception)
        let myView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
        let errorLabel :UILabel = UILabel(frame: CGRect(x: 10, y: (UIScreen.main.bounds.height/2) - 25 , width: UIScreen.main.bounds.width - 20 , height: 50))
        errorLabel.text = "Exception"
        myView.addSubview(errorLabel)
        self.window?.addSubview(myView)
  }
    return true
}

Но я получаю эту ошибку при кодировании:

Указатель функции AC не может бытьсформирован из замыкания, которое захватывает контекст.

Я много искал, но не смог найти ответа.Есть ли что-нибудь еще, что мне нужно сделать?

ОБНОВЛЕНИЕ:

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

1 Ответ

0 голосов
/ 19 января 2019

Подводя итог вышеприведенному обсуждению: В вашем подходе есть различные проблемы:

  • Аргументом NSSetUncaughtExceptionHandler является указатель на функцию C.Вы можете передать замыкание в Swift, но только если замыкание не захватывает какой-либо контекст.В вашем случае закрытие не может использовать self.Решение от Как использовать метод экземпляра в качестве обратного вызова для функции, которая принимает только функцию или закрытие литерала ?здесь нельзя использовать, потому что NSSetUncaughtExceptionHandler() не имеет параметра «context».

  • Даже если вам удастся сослаться на делегат приложения в обработчике исключений: он может быть вызван в любом потоке, поэтомучто вызывать любые связанные с пользовательским интерфейсом методы, такие как добавление представлений или меток, может быть неопределенным поведением.

  • NSSetUncaughtExceptionHandler перехватывает только исключения Objective-C, но не ошибки Swift (с throw) или исключения во время выполнения Swift (такие как «неожиданно найденный ноль»).

  • Даже если исключение обнаружено, вы не можете «обработать» его таким образом, чтобы программа продолжала впоследствии.Он по-прежнему будет зависать.

Вы написали в комментарии

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

Обработчик исключений не подходит для этой цели.Используйте необязательную привязку, дополнительные приведения, охранники и т. Д. Для обработки ответа и избегайте исключений времени выполнения.

...