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:parse-error

表示解释器在解析(阅读)特定的代码时失败。

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"字段,用于提供假定的报错位置信息。通常,errlasterror返回。

另请参阅: 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.


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

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