Spec-Zone.ru › Octave 9

Next: Восстановление после ошибок, Previous: Вызов ошибок, Up: Обработка ошибок [Оглавление][Индекс]

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", все поля устанавливаются в значения по умолчанию.

См. также: lasterr, error, lastwarn.

: [msg, msgid] = lasterr () ¶
: lasterr (msg) ¶
: lasterr (msg, msgid) ¶

Получить или установить последнее сообщение об ошибке.

При вызове без входных аргументов возвращает последнее сообщение об ошибке и идентификатор сообщения.

С одним аргументом устанавливает последнее сообщение об ошибке на msg.

С двумя аргументами также устанавливает идентификатор последнего сообщения.

См. также: lasterror, error, lastwarn.

Следующий пример подсчитывает ошибки индексирования. Ошибки ловятся с использованием идентификатора поля структуры, возвращаемой функцией 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.

См. также: lasterror, lasterr, error.

: 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.

Next: Восстановление после ошибок, Previous: Вызов ошибок, Up: Обработка ошибок [Оглавление][Индекс]

© 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/v9.2.0/Catching-Errors.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API