Как пузырить объект ошибки несколькими способами? - PullRequest
1 голос
/ 18 декабря 2010

Это больше вопрос о Си, но здесь он идет.

У меня есть метод, который получает в качестве параметра адрес указателя на объект NSError.Теперь этот метод скрыт на нескольких уровнях в иерархии классов, и мне нужно, чтобы объект ошибки пузырился до самого верха.

Я мог бы вернуть объект ошибки в каждом методе, но я бы предпочел сделатьэто способ Какао и возврат логического значения при передаче объекта ошибки в качестве параметра.

Как я могу это сделать?

1 Ответ

1 голос
/ 19 декабря 2010

Я мог бы вернуть объект ошибки в каждом методе, но я бы предпочел сделать это способом Какао и вернуть логическое значение при передаче объекта ошибки в качестве параметра.

Способ Какаоявляется логическим прямым возвратом с помощью обратной ссылки (т.е. через указатель) значения ошибки, например:

NSError *error = nil;
if ([foo trySomething:bar error:&error]) {
    //Success!
} else {
    //Failure!
}

(В качестве альтернативы, trySomething:error: может возвращать объект, в этом случае вы обрабатываетеэтот объект как логическое возвращение: non- nil является истинным / успешным, nil ложным / неудачным.)

Чтобы сделать это цепным, каждый метод (кроме самого внешнего) должен иметь указатель ошибкии используйте его в своей реализации:

- (void) trySomething:(MyBar *)bar error:(out NSError **)outError
    if ([bartender restock:bar error:outError]) {
        //Success!
    } else {
        //Failure!
    }
}

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

...