В Objective C, как мне избежать всей этой обширной обработки ошибок в моих методах? Я читал, что Apple предлагает, чтобы ссылки NSError использовались только тогда, когда ожидались ошибки, но этот подход заставляет код полностью загромождать код обработки ошибок.Как избежать обширного кода обработки ошибок на каждом уровне в Objective C
Существует особенно одна фраза в этом документе, что бросается в глаза;
библиотека анализа может использовать исключения внутри, чтобы указывать проблемы и обеспечивать быстрый выход из состояния синтаксического анализа, которое может быть глубоко рекурсивным; Однако, вы должны позаботиться, чтобы поймать такие исключения на верхнем уровне библиотеки и перевести их в соответствующий код возврата или состояние
Это (неполное и неоптимизированная) фрагмент кода демонстрирует, что я имею в виду. Каждый вызов, который я делаю в моем методе, требует проверки ошибок на каждом шаге, загромождения кода с помощью операторов if и затруднения чтения.
- (NSNumber) countFriendsForUserName:(NSString*) userName error:(NSError **)error {
NSError *internalError = nil;
Session *session = [_sessionMgr openSessionWithError:&internalError];
if (!error) {
User *user = [session findUserByName:userName error:&internalError];
if (!error) {
NSArray * bestFriends = [session getFriendsByUserId:user.id error:&internalError];
}
}
[_sessionMgr closeSession];
if (internalError) {
*error=internalError;
return 0;
}
return [bestFriends count];
}
Если бы я должен был использовать исключения вместо этого, код будет выглядеть примерно так (опять же, этот кусок кода лишь неполный пример), я не XCode передо мной на данный момент.
- (NSNumber) countFriendsForUserName:(NSString*) userName error:(NSError **)error {
@try{
Session *session = [_sessionMgr openSession];
User *user = [session findUserByName:userName];
NSArray * bestFriends = [session getFriendsByUserId:user.id];
[_sessionMgr closeSession];
return [bestFriends count];
}
@catch (NSException *e) {
[_sessionMgr closeSession];
*error=[ExceptionParser createNSErrorFromException:e];
return 0;
}
}
Если интерпретировать принципы Apples Исключения правильно, если мой код ведет себя как «разбор библиотека» (яблоки, например) может быть полностью нормально использовать исключения внутренне, и просто перевести их, прежде чем я вернусь к призванию функция, которая затем, в свою очередь, может действовать на мои коды NSError для принятия соответствующих мер. Или я неправильно понял руководство Apple?
вы печатаете быстрее меня;) – bryanmac
Это очень действительные баллы. Но мне все еще интересно, почему Исключения не будут лучше? Код не требует каких-либо операторов if, и на последнем шаге перед возвратом результата в приложение (и пользователь) исключение будет переведено в NSError, которое пользовательский интерфейс пользователя может интерпретировать. –
Вы должны использовать исключения для исключительных условий. Если метод возвращает значение, а возвращаемое значение - «NO» или «nil» или что-то еще, это необязательно является ошибкой. Это просто означает, что искомая вещь не существует, и это не ошибка, если вы хотите увидеть, нужно ли вам добавлять эту вещь или нет. Исключения также являются дорогостоящими и громоздкими для обработки на мелкозернистом уровне. – Droppy