2014-12-12 5 views
1

В Objective C, как мне избежать всей этой обширной обработки ошибок в моих методах? Я читал, что Apple предлагает, чтобы ссылки NSError использовались только тогда, когда ожидались ошибки, но этот подход заставляет код полностью загромождать код обработки ошибок.Как избежать обширного кода обработки ошибок на каждом уровне в Objective C

Apples guide to Exceptions

Существует особенно одна фраза в этом документе, что бросается в глаза;

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

Это (неполное и неоптимизированная) фрагмент кода демонстрирует, что я имею в виду. Каждый вызов, который я делаю в моем методе, требует проверки ошибок на каждом шаге, загромождения кода с помощью операторов 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?

ответ

3

Вы должны проверить возвращаемое значение метода, а не наличие объекта NSError. Кроме того, вы можете приковать NSError объектов вернуть ошибку низкоуровневой обратно вызывающему:

- (NSInteger)countFriendsForUserName:(NSString*)userName 
           error:(NSError **)error 
{ 
    NSArray *bestFriends = nil; 
    Session *session = [_sessionMgr openSessionWithError:error]; 
    if (session) { 
     User *user = [session findUserByName:userName error:error]; 
     if (user) { 
      bestFriends = [session getFriendsByUserId:user.id error:error]; 
     } 
    } 
    [_sessionMgr closeSession]; 
    return [bestFriends count]; 
} 

Примечания:

  • Перемещенных bestFriends в верхнюю части методы.
  • Изменен тип возврата.
+1

вы печатаете быстрее меня;) – bryanmac

+0

Это очень действительные баллы. Но мне все еще интересно, почему Исключения не будут лучше? Код не требует каких-либо операторов if, и на последнем шаге перед возвратом результата в приложение (и пользователь) исключение будет переведено в NSError, которое пользовательский интерфейс пользователя может интерпретировать. –

+0

Вы должны использовать исключения для исключительных условий. Если метод возвращает значение, а возвращаемое значение - «NO» или «nil» или что-то еще, это необязательно является ошибкой. Это просто означает, что искомая вещь не существует, и это не ошибка, если вы хотите увидеть, нужно ли вам добавлять эту вещь или нет. Исключения также являются дорогостоящими и громоздкими для обработки на мелкозернистом уровне. – Droppy