我正在使用其他人的代码而我不熟悉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
答案 0 :(得分:3)
是的,error('')
和error([])
以及error(struct([]))
都不会显示错误消息并中止正在运行的代码。我个人认为使用error
的单字符串参数版本在任何实际代码中都是不好的做法。在为函数编写错误时,您应始终使用'MSGID'
和'ERRMSG'
,例如。
error('FunctionName:SubFunctionName:ErrorMSGID','Error message to be printed.')
或者,您可以将MException
个对象与throw
,rethrow
和throwAsCaller
结合使用,以便您重复使用错误信息。更多here。
答案 1 :(得分:1)
这很奇怪,但它位于documentation for error
,error('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)
在这种情况下,将生成错误,但代码不会停止,在一般情况下,您将听不到哔声。在你的情况下,它应该抓住。