Spec-Zone.ru › Octave 9

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.

© 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

Spec-Zone.ru

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