Выдача исключений
Как только Ваша программа обнаруживает исключение, она должна распространить исключение для кодирования, который обрабатывает ее. Этот код вызывают обработчиком исключений. Этот весь процесс распространения исключения упоминается как «выдача исключения” (или «повышение исключения»). Вы выдаете (или повышение) исключение путем инстанцирования NSException
возразите и затем выполнение одной из двух вещей с ним:
Используя его как параметр a
@throw
директива компилятораОтправка его a
raise
сообщение
Следующий пример показывает, как Вы выдаете исключение с помощью @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
оператор. Это поведение имеет импликации для управления памятью (см. Обработку исключений и управление памятью).