Исключение не ловится - PullRequest
0 голосов
/ 27 июня 2019

Crashlytics сообщает, что следующая строка иногда , выбрасывающая NSInternalInconsistencyException:

let attrStr = try NSMutableAttributedString(
        data: modifiedFont.data(using: String.Encoding.unicode, 
        allowLossyConversion: true)!,
        options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue],
        documentAttributes: nil)

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

do {
    let attrStr = try NSMutableAttributedString(
       data: modifiedFont.data(using: String.Encoding.unicode, allowLossyConversion: true)!,
       options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue],
       documentAttributes: nil)

     self.attributedText = attrStr
} catch {
    self.attributedText = nil
    self.text = text.stripHTML()
}

... но по какой-то причине это не работает - об исключении все еще сообщается.

Я пытаюсь поймать это правильно? Можно ли вообще его поймать? Если нет, какие у меня варианты?

Ответы [ 3 ]

2 голосов
/ 28 июня 2019

Swift преобразует методы Objective-C с обнуляемыми возвратами и конечными параметрами NSError** в методы, которые выдают в Swift.Но в Objective-C вы также можете генерировать исключения.Они отличаются от NSError s, и Свифт их не ловит.На самом деле нет никакого способа поймать их в Swift.Вам нужно написать оболочку Objective-C, которая перехватывает исключение и каким-то образом передает его обратно Swift.

Это можно найти в документе Apple Обработка ошибок какао в Swift в разделе Обработка исключений только в Objective-C .

Получается, что вы можете его поймать, но стоит подумать, стоит ли вам это делать (см. комментарииот @Sulthan ниже).Насколько я знаю, большинство фреймворков Apple не являются безопасными для исключений (см .: Исключения и рамки Какао ), поэтому вы не можете просто поймать исключение и продолжить, как будто ничего не произошло.Лучше всего сохранить то, что вы можете, и выйти как можно скорее.Еще одна проблема, которую следует учитывать, заключается в том, что, если вы не выбросите исключение, фреймворки, такие как Crashlytics, не сообщат вам об этом.Итак, если вы решили поймать его, вы должны зарегистрировать его и / или сбросить, чтобы вы знали, что это происходит.

0 голосов
/ 28 июня 2019

NSInternalInconsistencyException - исключение Objective C, которое не может быть поймано кодом Swift. Вы можете перехватывать исключения такого типа только с помощью кода Objective-C, поэтому вам потребуется создать оболочку Objective-C, чтобы перехватывать ее из кода Swift, например, с помощью следующего метода Objective-C:

+ (NSException *)tryCatchWithBlock:(void (^)(void))block {
    @try {
        block();
    } @catch (NSException *exception) {
        return exception;
    } @catch (id exception) {
        return [NSException exceptionWithName:NSGenericException reason:nil userInfo:nil];
    }
    return nil;
}

Этот метод является частью моей библиотеки под названием LSCategories: https://github.com/leszek-s/LSCategories с различными полезными категориями / расширениями, так что вы также можете легко интегрировать эту библиотеку с CocoaPods в ваш проект Swift, а затем вы можете поймать исключение NSInternalInconsistencyException, обернув ваш swift код такой:

let objcException = NSException.lsTryCatch {
    // put your swift code here
}

Так вот, как вы можете поймать это исключение, если хотите это сделать. Но что более важно, вы должны выяснить, почему это исключение возникает в вашем случае. Возможно, вы вызываете свой код в фоновом потоке.

0 голосов
/ 27 июня 2019

Я думаю, сбой происходит, когда вы пытаетесь преобразовать modifiedFont в Data.
modifiedFont.data(using: String.Encoding.unicode, allowLossyConversion: true)! Скорее всего, вы получите ту же ошибку, если переместите строку преобразования данных из области действия try-catch. Во избежание сбоя не применяйте принудительное развертывание (!).

Поймано, если какие-либо ошибки генерируются во время инициализации NSMutableAttributedString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...