Выдача исключений

Как только Ваша программа обнаруживает исключение, она должна распространить исключение для кодирования, который обрабатывает ее. Этот код вызывают обработчиком исключений. Этот весь процесс распространения исключения упоминается как «выдача исключения” (или «повышение исключения»). Вы выдаете (или повышение) исключение путем инстанцирования NSException возразите и затем выполнение одной из двух вещей с ним:

Следующий пример показывает, как Вы выдаете исключение с помощью @throw директива ( raise альтернатива комментируется):

NSException* myException = [NSException
        exceptionWithName:@"FileNotFoundException"
        reason:@"File Not Found on System"
        userInfo:nil];
@throw myException;
// [myException raise]; /* equivalent to above directive */

Важное различие между @throw и raise это, последний может быть отправлен только в NSException объект, тогда как @throw может взять другие типы объектов как его параметр (такие как строковые объекты). Приложения какао должны @throw только NSException объекты.

Обычно Вы бросаете или повышаете исключение в домене обработки исключений, который является блоком кода, отделенным @try директива компилятора.

Посмотрите Исключения Обработки для подробных данных.

В доменах обработки исключений можно повторно распространить исключения, пойманные локальными обработчиками исключений к высокоуровневым обработчикам любой путем отправки NSException возразите другому raise обменивайтесь сообщениями или при помощи его с другим @throw директива. Обратите внимание на то, что в @catch блоки обработки исключений можно повторно бросить исключение, явно не указывая объект исключения, как в следующем примере:

@try {
    NSException *e = [NSException
        exceptionWithName:@"FileNotFoundException"
        reason:@"File Not Found on System"
        userInfo:nil];
    @throw e;
}
@catch(NSException *e) {
    @throw; // rethrows e implicitly
}

Существует тонкий аспект поведения, включающего перевызванные исключительные ситуации. @finally блок связался с локальной переменной @catch обработчик исключений выполняется перед @throw заставляет следующий более высокий обработчик исключений быть вызванным. В некотором смысле, @finally блок выполняется как ранний побочный эффект @throw оператор. Это поведение имеет импликации для управления памятью (см. Обработку исключений и управление памятью).