В Objective C, как мне избежать всей этой обширной обработки ошибок в моих методах? Я читал, что Apple предлагает использовать ссылки NSError только тогда, когда ожидаются ошибки, но такой подход приводит к тому, что код полностью загромождается кодом обработки ошибок.
Руководство Apple по исключениям
В этом документе мне особенно бросается в глаза одно предложение;
библиотека синтаксического анализа может использовать внутренние исключения, чтобы указать на проблемы и обеспечить быстрый выход из состояния синтаксического анализа, которое может быть глубоко рекурсивным; однако вы должны позаботиться о том, чтобы перехватывать такие исключения на верхнем уровне библиотеки и преобразовывать их в соответствующий код возврата или состояние.
Это (неполный и неоптимизированный) фрагмент кода, демонстрирующий, что я имею в виду. Каждый вызов, который я делаю в своем методе, требует проверки ошибок на каждом этапе, загромождая код операторами 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;
}
}
Если я правильно интерпретирую рекомендации Apple по исключениям, если мой код ведет себя как «библиотека синтаксического анализа» (пример Apple), может быть совершенно нормально использовать исключения внутри и просто переводить их, прежде чем я вернусь к вызывающей функции, что, в свою очередь, может воздействовать на мои коды NSError, чтобы предпринять соответствующие действия. Или я неправильно понял рекомендации Apple?