用于matlab的顺序try catch end block

时间:2017-09-14 15:24:54

标签: matlab try-catch

我想运行几行代码,但我不确定是否有任何行会引发错误。如果发生错误,我希望脚本忽略该行并继续。

一种选择是拥有try-catch-end块,跳过可能引发错误的代码块。但是,只要发生错误,就不会执行try-statement中的错误之后的其余代码。

TL; TR:除了在以下示例代码中为每一行写一个try-catch-end块之外,我还有其他选择吗?

示例代码:

try
  disp('1st line');
  disp('2nd line');
  PRODUCE_ERROR;  %throws an error, variable/function does not exist
  disp('3rd line'); %%%%%
  disp('4th line'); % these lines I would like to keep executing
  disp('5th line'); %%%%%
catch
  disp('something unexpected happened');
end

输出:

1st line
2nd line
something unexpected happened

首选的输出:

1st line
2nd line
something unexpected happened
3rd line
4th line
5th line

相关:Why should I not wrap every block in "try"-"catch"?

2 个答案:

答案 0 :(得分:4)

一种选择是将每个代码段放在一个函数中,并迭代cell arrayfunction handles。这是一个包含anonymous functions列表的示例:

fcnList = {@() disp('1'); ...
           @() disp('2'); ...
           @() error(); ...    % Third function throws an error
           @() disp('4')};

for fcnIndex = 1:numel(fcnList)
  try
    fcnList{fcnIndex}();  % Evaluate each function
  catch
    fprintf('Error with function %d.\n', fcnIndex);  % Display when an error happens
  end
end

这是生成的输出,显示即使在抛出错误之后仍然会评估函数:

1
2
Error with function 3.
4

上面的示例适用于您希望按顺序评估单独行代码的情况,但您无法将多行放入匿名函数中。在这种情况下,如果他们必须访问较大工作区中的变量,或者nested functions,如果他们可以独立操作,我将使用local functions。以下是嵌套函数的示例:

function fcn1
  b = a+1;     % Increments a
  fprintf('%d\n', b);
end
function fcn2
  error();     % Errors
end
function fcn3
  b = a.^2;    % Squares a
  fprintf('%d\n', b);
end

a = 2;
fcnList = {@fcn1 @fcn2 @fcn3};

for fcnIndex = 1:numel(fcnList)
  try
    fcnList{fcnIndex}();
  catch
    fprintf('Error with function %d.\n', fcnIndex);
  end
end

输出:

3
Error with function 2.
4

答案 1 :(得分:1)

更简单的方法是逐行读取脚本文件并依次评估每一行。这假定您要运行的脚本不包含任何多行语句(例​​如forend在不同的行上,或者语句使用{{1分为多行}})。这是一个很大的限制,因为它是常见的。使用多行文本初始化矩阵。

这是功能:

...

完全如上所述:它读取一行,然后使用function execute_script(fname) fid = fopen(fname,'rt'); n = 0; while ~feof(fid) cmd = fgetl(fid); n = n+1; if ~isempty(cmd) try evalin('caller',cmd); catch exception disp(['Error occurred executing line number ',num2str(n),': ',exception.message]); end end end 来评估调用者工作空间中的那一行。创建的任何变量都是在调用者工作区中创建的。使用的任何变量都来自调用者的工作区。

例如,我使用以下内容创建文件evalin

testscript.m

接下来,在MATLAB命令提示符下:

A = 1;
B = 2+C; % This line needs a variable not defined in the script!
D = 5;

创建了变量>> execute_script('testscript.m') Error occurred executing line number 2: Undefined function or variable 'C'. >> whos Name Size Bytes Class Attributes A 1x1 8 double D 1x1 8 double A。如果我定义D

C

定义变量>> C=0; >> execute_script('testscript.m') >> whos Name Size Bytes Class Attributes A 1x1 8 double B 1x1 8 double C 1x1 8 double D 1x1 8 double 后,脚本无错运行,并定义C