12.1.1报错

错误最常见的用途是检查函数的输入参数。以下示例调用error函数ift函数f在没有任何输入参数的情况下调用。

function f (arg1)
  if (nargin == 0)
    error ("not enough input arguments");
  endif
endfunction

error函数被调用时,它会打印给定的消息并返回到Octave提示符。这意味着调用后没有代码error将被执行。

也可以将标识字符串赋值给错误。如果一个错误有这样的ID,用户可以捕捉到这里的错误,这将在下一节中描述。要为错误赋值ID,只需调用error有两个字符串参数,其中第一个是标识字符串,第二个是实际错误。请注意,错误ID的格式为"NAMESPACE:ERROR-NAME"。命名空间"Octave"用于Octave自己的错误。任何其他字符串都可用作用户自身错误的命名空间。

 
: error (template, …)
: error (id, template, …)

显示错误消息并停止m文件执行。

在模板字符串的控制下设置可选参数的格式template使用与相同的规则printf函数族(详见格式化输出)并将生成的消息打印在stderr流动只有在模板字符串后面有其他参数的情况下,才对单引号字符向量进行此格式化。如果没有其他参数,则按字面意思使用模板字符串(即,不解释单引号字符向量中的任何转义序列)。消息前缀为‘error: ’.

可选的 id 参数允许程序员用一个特定ID标记一个错误 这样用户可以稍后收到它(用 lasterrlasterror)并且知道错误的来源。 ID必须包含至少一个冒号 (':') 且必须不包含任何空格字符。它必须是一个 "NAMESPACE:ERROR-NAME"形式的字符串。 Octave 自身的错误使用 "Octave" 命名空间 (详见 error_ids). 例如:

error ("MyNameSpace:wrong-type-argument",
       "fcn_name: argument should be numeric");

调用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,中的escapesequencestemplate(例如"\n"=>换行符),而不管是否template已经用单引号定义,只要有两个或多个输入参数。可禁用的转义序列扩展在序列之前使用第二个反斜杠(例如"\\n")或使用regexptranslate作用

详见: warning, lasterror.

广告

因为在函数输入出现错误时使用错误是很常见的,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)

打印函数的使用消息name.

当在没有输入参数的情况下调用时print_usage函数显示当前正在执行的函数的使用消息。

详见: help.

广告
 
: beep ()

扬声器发出嘟嘟声(或可视铃声)。

此函数发送报警字符"\a"到终端。根据用户的配置,这可能会返回可听见的嘟嘟声、可视铃声,或者什么都不返回。

详见: puts, fputs, printf, fprintf.

广告
 
: val = beep_on_error ()
: old_val = beep_on_error (new_val)
: old_val = beep_on_error (new_val, "local")

查询或设置内部变量,该变量控制Octave在打印错误消息之前是否尝试振铃终端。

当从具有的函数内部调用时"local"参数,则该变量会为函数及其调用的任何子程序在本地进行更改。退出函数时将恢复原始变量值。

广告

版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2