Как я понимаю, использование блоков @try/@catch
не рекомендуется, потому что exceptions
следует бросать только на неустранимые, катастрофические ошибки (см. обсуждение с хорошим ответом @bbum: Обработка исключений в iOS).
Итак, я просмотрел свой код и нашел блок @try/@catch
, который я не знаю, как избавиться от него:
NSData *fileData = [NSData dataWithContentsOfFile: ....];
NSDictionary *dictionary;
@try {
dictionary = [NSKeyedUnarchiver unarchiveObjectWithData: fileData];
}
@catch (NSException *exception) {
//....
}
@finally {
//...
}
Проблема заключается в том, что (как указано в documentation) +unarchiveObjectWithData:
вызывает NSInvalidArchiveOperationException
, если NSData
doesn 't содержать допустимый архив.
Поскольку данные предоставлены файлом, который пользователь выбрал, он не гарантирует, что он содержит действительный архив, и, таким образом, приложение будет разбиваться, если был выбран неправильный файл.
Теперь два вопроса:
- Почему не
+unarchiveObjectWithData:
просто возвращаетnil
( Изменить: иNSError**
), если архив недействителен (это не похоже на катастрофическую или неустранимую ошибку). - Правилен ли шаблон выше (используя
@try
)? Я не нашел метода, который позволяет нам проверить, действительно ли данные содержат допустимый архив, и не нашли возможности обработать этот случай с использованием протокола делегата. Антитесь, я забыл?
Обратите внимание, что код, который, конечно, работает, я просто задаюсь вопросом, есть ли у него лучшая практика.