12.1.1 Вызов ошибок ¶
Наиболее распространенное использование ошибок — проверка входных аргументов функций. В следующем примере вызывается функция error, если функция f вызывается без входных аргументов.
function f (arg1)
if (nargin == 0)
error ("not enough input arguments");
endif
endfunction Когда вызывается функция error, она выводит заданное сообщение и возвращается к окну Octave. Это означает, что код, следующий за вызовом error, не будет выполнен.
Также можно назначить строку идентификации ошибке. Если у ошибки есть такой идентификатор, пользователь может перехватить эту ошибку, как будет описано в следующем разделе. Чтобы назначить идентификатор ошибке, просто вызовите error с двумя строковыми аргументами, где первый — строка идентификации, а второй — фактическая ошибка. Обратите внимание, что идентификаторы ошибок имеют формат "NAMESPACE:ERROR-NAME". Пространство имен "Octave" используется для собственных ошибок Octave. Любая другая строка доступна в качестве пространства имен для собственных ошибок пользователя.
-
: error
(template, …)¶ -
: error
(id, template, …)¶ -
Вывести сообщение об ошибке и остановить выполнение файла m.
Форматировать необязательные аргументы под управлением шаблона строки шаблон по тем же правилам, что и семейство функций
printf(см. Форматированный вывод), и выводить полученное сообщение в потокstderr. Это форматирование выполняется только для одиночных строковых переменных, если после строки шаблона есть дополнительные аргументы. Если дополнительных аргументов нет, строка шаблона используется буквально (т.е. без интерпретации escape-последовательностей в одиночных строковых переменных). К сообщению добавляется префикс ‘ошибка: ’.Вызов
errorтакже устанавливает внутреннее состояние ошибки Octave таким образом, что управление возвращается на верхний уровень без вычисления дальнейших команд. Это полезно для прерывания выполнения функций или скриптов.Если сообщение об ошибке не заканчивается символом новой строки, Octave выведет трассировку всех вызовов функций, приведших к ошибке. Например, при заданных определениях функций:
function f () g (); end function g () h (); end function h () nargin == 1 || error ("nargin != 1"); endвызов функции
fприведет к списку сообщений, которые помогут быстро найти точное местоположение ошибки:f () error: nargin != 1 error: called from: error: h at line 1, column 27 error: g at line 1, column 15 error: f at line 1, column 15
Если сообщение об ошибке заканчивается символом новой строки, Octave выведет сообщение, но не отобразит сообщения трассировки, так как управление возвращается на верхний уровень. Например, изменение сообщения об ошибке в предыдущем примере, чтобы оно заканчивалось символом новой строки, заставляет Octave выводить только одно сообщение:
function h () nargin == 1 || error ("nargin != 1\n"); end f () error: nargin != 1Пустая строка ("") в качестве входного аргумента для
errorбудет проигнорирована, и код продолжит выполнение, как если бы оператор был NOP. Это для совместимости с MATLAB. Это также позволяет писать код, такой какerr_msg = ""; if (CONDITION 1) err_msg = "CONDITION 1 found"; elseif (CONDITION2) err_msg = "CONDITION 2 found"; ... endif error (err_msg);
который будет останавливать выполнение только в том случае, если была обнаружена ошибка.
Примечание о реализации: Для совместимости с MATLAB escape-последовательности в шаблоне (например,
"\n"=> новая строка) обрабатываются независимо от того, определен ли шаблон с одинарными кавычками, как только что есть два или более входных аргументов. Чтобы отключить расширение escape-последовательностей, используйте второй обратный слэш перед последовательностью (например,"\\n") или функциюregexptranslate.
Поскольку использование ошибок при возникновении проблем с вводом в функцию является распространенной практикой, Octave поддерживает функции для упрощения такого кода. При вызове функции print_usage она считывает текст справки функции, вызывающей print_usage, и предоставляет полезную ошибку. Если текст справки написан в формате Texinfo, можно отобразить сообщение об ошибке, содержащее только прототипы функций, как описано в частях @deftypefn текста справки. Если текст справки не написан в формате Texinfo, сообщение об ошибке содержит весь текст справки.
Рассмотрим следующую функцию.
## -*- texinfo -*-
## @deftypefn {} f (@var{arg1})
## Function help text goes here...
## @end deftypefn
function f (arg1)
if (nargin == 0)
print_usage ();
endif
endfunction При вызове без входных аргументов она генерирует следующую ошибку.
f () -| error: Invalid call to f. Correct usage is: -| -| -- f (ARG1) -| -| -| Additional help for built-in functions and operators is -| available in the online version of the manual. Use the command -| 'doc <topic>' to search the manual index. -| -| Help and information about Octave is also available on the WWW -| at https://www.octave.org and via the help@octave.org -| mailing list.
-
: print_usage
()¶ -
: print_usage
(name)¶ -
Вывести сообщение об использовании функции имя.
При вызове без входных аргументов функция
print_usageотображает сообщение об использовании текущей выполняемой функции.См. также: help.
-
: beep
()¶ -
Сгенерировать звуковой сигнал (или визуальный звонок).
Эта функция отправляет символ сигнала
"\a"в терминал. В зависимости от конфигурации пользователя это может привести к звуковому сигналу, визуальному звонку или к отсутствию каких-либо действий.
-
:
val =beep_on_error()¶ -
:
old_val =beep_on_error(new_val)¶ -
:
old_val =beep_on_error(new_val, "local")¶ -
Запрос или установка внутренней переменной, управляющей тем, будет ли Octave пытаться прозвонить звонок терминала перед выводом сообщения об ошибке.
При вызове изнутри функции с опцией
"local", переменная изменяется локально для функции и для всех вызываемых ею подпрограмм. Исходное значение переменной восстанавливается при выходе из функции.
© 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/Raising-Errors.html