用空字符串尝试/捕获和错误

时间:2013-12-04 18:32:56

标签: matlab error-handling try-catch

我正在使用其他人的代码而我不熟悉try / catch所以我做了一个类似的小例子。在第11行,如果我写error(''),它似乎没有捕获错误并增加索引j。但是,写error(' ')error('bad!')可以。

使用空字符串时出错会忽略错误,还是我做错了什么?

% Just a file to understand the Matlab command try/catch

M = 3;
j = 1;
k = [Inf, 5, 4];

while M>0
    try
        M = M-1
        u = k(j)
        if (isinf(u)||isnan(u)), error(''), end;
    catch
        j = j+1
    end
end

4 个答案:

答案 0 :(得分:3)

是的,error('')error([])以及error(struct([]))都不会显示错误消息并中止正在运行的代码。我个人认为使用error的单字符串参数版本在任何实际代码中都是不好的做法。在为函数编写错误时,您应始终使用'MSGID''ERRMSG',例如。

error('FunctionName:SubFunctionName:ErrorMSGID','Error message to be printed.')

或者,您可以将MException个对象与throwrethrowthrowAsCaller结合使用,以便您重复使用错误信息。更多here

答案 1 :(得分:1)

这很奇怪,但它位于documentation for errorerror('msgString')语法:

  

所有字符串输入参数必须用单引号括起来。如果msgString为空字符串,则错误命令无效。

同样,如果使用error(msgStruct)语法:

  

如果msgStruct是一个空结构,则不会执行任何操作并返回错误而不退出该函数。

答案 2 :(得分:0)

如果您查看try文档,可以举例说明。

其他想要你的代码吧:

M = 3;
j = 1;
k = [Inf, 5, 4];

while M>0
    try
        M = M-1
        u = k(j)
        if (isinf(u)||isnan(u)), error(''), end;
    catch
        disp('I catch an error!');
        j = j+1
    end
end

因为如果你的代码中永远不会出现错误,那么它永远不会被捕获。因此,通过包含error('');,只需说,执行catch中的语句。

但您可以通过将error()语句替换为您的catch中来修改代码,如下所示:

while M>0
        M = M-1
        u = k(j)
        if (isinf(u)||isnan(u)), j = j+1, end;
end

修改

如果您查看文档,可以找到:

%   ERROR(MSGSTRUCT) reports the error using fields stored in the scalar
%   structure MSGSTRUCT. This structure can contain these fields:
%
%       message    - Error message string
%       identifier - See MESSAGE IDENTIFIERS, below
%       stack      - Struct similar to the output of the DBSTACK function
%  
%   If MSGSTRUCT is an empty structure, no action is taken and ERROR
%   returns without exiting the program. If you do not specify the
%   stack, the ERROR function determines it from the current file and line.

所以不要采取任何行动,因为你可以阅读。什么都没有,所以赶不上任何信息。

答案 3 :(得分:0)

不确定为什么需要它,但这是它的工作原理。

error函数不会抛出空字符串或空向量([])作为参数的错误。

如果你没有指定参数,error函数本身会产生错误“没有足够的参数”。所以它会抓住。

另一种方法是将空结构指定为参数。

s = struct();
error(s)

在这种情况下,将生成错误,但代码不会停止,在一般情况下,您将听不到哔声。在你的情况下,它应该抓住。