如何使用单线打印捕获的异常的堆栈跟踪?

时间:2018-08-08 09:01:44

标签: matlab exception try-catch warnings stack-trace

我想捕获一个异常,但是打印出与未捕获(堆栈跟踪)相同的消息。该怎么做?

我尝试了

>> myfunctionwitherror
Error using myfunctionwitherror (line 3)
myerror

>> try myfunctionwitherror; catch disp(lasterror), end
Warning: This try-catch syntax will continue to work in R2007b, but may be illegal or may mean something different in future releases of MATLAB.
See MATLAB R2007a Release Notes, "Warning Generated by try-catch" for details. 
  MException with properties:

    identifier: ''
       message: 'myerror'
         cause: {0×1 cell}
         stack: [0×1 struct]

>> try myfunctionwitherror, catch e getReport(e), end
Warning: This try-catch syntax will continue to work in R2007b, but may be illegal or may mean something different in future releases of MATLAB.
See MATLAB R2007a Release Notes, "Warning Generated by try-catch" for details. 
Undefined function or variable 'e'.

如何做到这一点?


我正在使用2016b。我不知道为什么会出现此消息。

2 个答案:

答案 0 :(得分:5)

You are using 2007a syntax for try catch.

是:

try,
 statementA
catch,
 statementB
end

现在是

try
 statementA
catch e
 statementB
end

但是,当您编写一个衬板时,您忘记了;,因此您只是在混淆MATLAB有关行结束的时间,因此假设您正在做

try 
   myfunctionwitherror 
catch 
  e 
  getReport(e)
end

使用不明确的一个衬纸时,只需将分号放在应有的位置即可。或写多行。 ;)

 try; myfunctionwitherror; catch e; getReport(e); end;

如果要显示错误(不显示错误),只需

try; myfunctionwitherror; catch e; disp(e.message); end;

答案 1 :(得分:4)

在警告中单击链接时打开的documentation page语录:

  

尝试捕获产生的警告

     

为适应将来在MATLAB错误处理功能中的更改,False块的语法有了新的限制。当紧随try-catch关键字的第一个MATLAB语句仅包含与try相同的一行中的单个术语(例如A而不是A+B)时,那么该语句和try关键字应以逗号分隔。例如,线

try
     

应写为

try A
     

或两行为

try, A
     

这仅影响单项陈述。例如,以下语句继续有效:

try
   A
     

对于try A+B 关键字和该关键字后的单项语句在同一行上也是如此。 此类型的有效catch语句应组成如下

try-catch
     

如果在try和/或catch之后省略逗号,则代码将继续正确运行。但是,MATLAB会发出警告:

try, A, catch, B, end

结论:

try statements, catch statements, end

Warning: This try-catch syntax will continue to work in R2007a, 
but may be illegal or may mean something different in future 
releases of MATLAB.

(最后的try, myfunctionwitherror, catch e, disp(e.message), end %#ok<NOCOM> 是因为尝试后的逗号{至少在R2018a}上会产生棉绒警告,因为它似乎不必要,但是没有逗号,我们会得到运行时警告...去图)