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–2022 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/v7.2.0/Catching-Errors.html