12.1.2 Обработка ошибок
При возникновении ошибки её можно обнаружить и обработать с помощью оператора try, как описано в Операторе try. В качестве примера, следующий фрагмент кода подсчитывает количество ошибок, возникающих во время цикла for.
number_of_errors = 0;
for n = 1:100
try
…
catch
number_of_errors++;
end_try_catch
endfor Приведённый выше пример обрабатывает все ошибки одинаково. Однако во многих ситуациях необходимо различать типы ошибок и принимать разные действия в зависимости от них. Функция lasterror возвращает структуру, содержащую информацию о последней произошедшей ошибке. В качестве примера, код выше можно изменить, чтобы подсчитывать количество ошибок, связанных с оператором ‘*’.
number_of_errors = 0;
for n = 1:100
try
…
catch
msg = lasterror.message;
if (strfind (msg, "operator *"))
number_of_errors++;
endif
end_try_catch
endfor В качестве альтернативы, результат работы функции lasterror может быть получен в переменной, указанной сразу после ключевого слова catch, как показано в примере ниже, демонстрирующем перенаправление ошибки в предупреждение:
try … catch err warning(err.identifier, err.message); … end_try_catch
- : lasterr = lasterror () ¶
- : lasterror (err) ¶
- : lasterror ("reset") ¶
-
Получение или установка структуры последней ошибки.
Если вызывается без аргументов, возвращает структуру, содержащую сообщение об ошибке и другую информацию, связанную с этой ошибкой. Элементы структуры:
message-
Текст последнего сообщения об ошибке
identifier-
Идентификатор сообщения об ошибке
stack-
Структура, содержащая информацию о месте возникновения сообщения об ошибке. Может быть пустой, если информация недоступна. Поля структуры:
file-
Имя файла, где произошла ошибка
name-
Имя функции, в которой произошла ошибка
line-
Номер строки, где произошла ошибка
columnНеобязательное поле с номером столбца, где произошла ошибка
Структура последней ошибки может быть установлена путём передачи скалярной структуры err в качестве входных данных. Любые поля err, соответствующие полям выше, будут установлены, а любые неуказанные поля будут инициализированы значениями по умолчанию.
Если функция
lasterrorвызывается с аргументом"reset", все поля устанавливаются в значения по умолчанию.
- : [msg, msgid] = lasterr () ¶
- : lasterr (msg) ¶
- : lasterr (msg, msgid) ¶
-
Получение или установка последнего сообщения об ошибке.
Если вызывается без входных аргументов, возвращает последнее сообщение об ошибке и идентификатор сообщения.
С одним аргументом, устанавливает последнее сообщение об ошибке на msg.
С двумя аргументами, также устанавливает идентификатор последнего сообщения.
Следующий пример подсчитывает ошибки индексирования. Ошибки обрабатываются с использованием идентификатора поля структуры, возвращаемой функцией lasterror.
number_of_errors = 0;
for n = 1:100
try
…
catch
id = lasterror.identifier;
if (strcmp (id, "Octave:invalid-indexing"))
number_of_errors++;
endif
end_try_catch
endfor Функции, поставляемые с Octave, могут генерировать следующие ошибки.
Octave:bad-alloc-
Указывает, что память не могла быть выделена.
Octave:invalid-context-
Указывает, что ошибка была сгенерирована операцией, которая не может быть выполнена в текущем контексте. Например, функция
print_usage ()при вызове из командной строки Octave вызывает эту ошибку. Octave:invalid-fun-call-
Указывает, что функция была вызвана некорректно, например, с неправильным количеством входных аргументов.
Octave:invalid-indexing-
Указывает, что индексирование данных было выполнено неправильно, например, использование действительного индекса для массивов, несуществующего поля структуры.
Octave:invalid-input-arg-
Указывает, что функция была вызвана с недопустимыми входными аргументами.
Octave:undefined-function-
Указывает вызов функции, которая не определена. Функция может существовать, но Octave не может найти её в пути поиска.
После обработки ошибки её можно повторно вызвать. Это может быть полезно, когда необходимо обнаружить ошибку, но программа должна всё равно прерваться. Это возможно с помощью функции rethrow. Предыдущий пример можно изменить, чтобы подсчитывать количество ошибок, связанных с оператором ‘*’, но при этом прерывать выполнение при возникновении другого типа ошибки.
number_of_errors = 0;
for n = 1:100
try
…
catch
msg = lasterror.message;
if (strfind (msg, "operator *"))
number_of_errors++;
else
rethrow (lasterror);
endif
end_try_catch
endfor - : rethrow (err) ¶
-
Повторно генерирует предыдущую ошибку, определённую в err.
err - структура, которая должна содержать по крайней мере поля
"message"и"identifier". err также может содержать поле"stack", которое даёт информацию о предполагаемом месте ошибки. Как правило, err возвращается функциейlasterror.
- : err = errno () ¶
- : err = errno (val) ¶
- : err = errno (name) ¶
-
Получение или установка системной переменной errno.
При вызове без входных данных, возвращает текущее значение errno.
При вызове с числовым входным значением val, устанавливает текущее значение errno на указанное значение. Предыдущее значение errno возвращается как err.
При вызове с строковым значением name, возвращает числовое значение errno, соответствующее указанному коду ошибки. Если name не является распознанным кодом ошибки, возвращается -1.
См. также: errno_list.
© 1996–2023 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v8.1.0/Catching-Errors.html