Suggest Fix for MATLAB Exception

Jan. 13, 2023

当MATLAB代码在运行的过程中遇到错误时,软件会抛出警告并中断程序,有时候进一步地给出一些解决的suggestion。例如,假如我们想要使用clc命令清理命令行窗口,但是误把命令输为ckccc,结果MATLAB就会报错:

image-20230113154031194

但是如果我们误输入为与clc相近的ckc时,MATLAB就会在报错的同时给出一个suggestion:

image-20230113154236171

实际上我们在编程的时候也可以针对指定的错误提供suggestion,这需要用到MException对象的addCorrection方法向MException对象中添加correction对象,然后再将MExcption对象rethrow或者throw出来(使用rethrow或者throw取决于在我们处理错误之前程序是否报错)。

addCorr ection函数的功能是:provide suggested fix for exception,官方文档提供了一个示例:Suggest Fix When Function Called Without Arguments

首先定义一个hello函数:

1
2
3
function hello(audience)
fprintf("Hello, %s!\n", audience);
end

该函数接受一个输入参数,并在命令行窗口打印欢迎语句,例如:

1
2
>> hello("Tommy")
Hello, Tommy!

如果我们不输入参数,则程序会报错:

1
2
3
4
5
>> hello
Not enough input arguments.

Error in hello (line 8)
fprintf("Hello, %s!\n", audience);

image-20230113174217985

我们可以使用下面的程序对这个错误给出解决建议:

1
2
3
4
5
6
7
8
9
10
function hello(audience)
if nargin < 1
    me = MException('MATLAB:notEnoughInputs', 'Not enough input arguments.');
    aac = matlab.lang.correction.AppendArgumentsCorrection('"world"');
    me = me.addCorrection(aac);
    throw(me);
end

fprintf("Hello, %s!\n", audience);
end

此时再调用没有参数的hello函数,程序就会给出suggestion:

1
2
3
4
5
6
>> hello
Error using hello
Not enough input arguments.
 
Did you mean:
>> hello("world")

image-20230113174514760

可以看到,程序使用MException类型变量meaddCorrection方法将变量acc添加到建立的me中。这里的变量acc是一个AppendArgumentsCorrection类型的对象,是matlab.lang.correction库专门提供的用于为error(更准确地说是Exception)提供suggestion的对象。除此之外,类似的对象还有两个,分别是:

  • matlab.lang.correction.ConvertToFunctionNotationCorrection
  • matlab.lang.correction.ReplaceIdentifierCorrection

image-20230113175422223