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.
-
:
S =errno_list() -
Возвращает структуру, содержащую системно-зависимые значения errno.
См. также: errno.
© 1996–2026 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/v9.4.0/Catching-Errors.html