Суть вашего вопроса в том, есть ли структурные улучшения, которые вы можете внести в обработку ошибок. Я думаю, что, по сути, вводя больше слоев вложения, либо извлекая больше кода в отдельные методы / функции, либо вводя вложение в высокоуровневом образце метода.
Идея заключается в том, что когда дело доходит до обработки большинства ошибок, вы, вероятно, либо заинтересованы в выполнении альтернативной задачи, либо в сбое и распространении ошибки по цепочке, чтобы какой-то ответственный контроллер мог передать ошибку пользователю через пользовательский интерфейс. .
Используя эту идею "распространять или обрабатывать", я бы переписал ваш пример метода следующим образом:
-(IBAction)buttonPress:(id)sender {
// Create Document Shopping List with this document
[self doSomething:&error];
if(error == nil) {
[self doSomethingElse:&error];
if (error == nil) {
[self doYetSomethingElse:&error];
}
}
if(error) {
[NSApp presentError:&error];
}
}
Обратите внимание, что существуют веские аргументы против введения слишком большого количества вложений в конкретный метод. Такое вложение, по сути, является короткой альтернативой методам извлечения. Например, может иметь больше смысла, что «doSomething:» само вызывает doSomethingElse :, который вызывает doYetSomethingElse: например. Это наложило бы на код ту же структуру, что и if-nest, но, возможно, было бы более удобным для сопровождения.
Кроме того, я не фанат встроенных операторов возврата. В этом конкретном случае образец метода на самом деле не вызывает возвращаемое значение, но если это так, я предпочитаю устанавливать локальную переменную в возвращаемое значение и возвращать только в конце управления потоком. Выскочить из функции или метода преждевременно - верный способ встретить странные ошибки, ИМХО.