我想运行几行代码,但我不确定是否有任何行会引发错误。如果发生错误,我希望脚本忽略该行并继续。
一种选择是拥有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
答案 0 :(得分:4)
一种选择是将每个代码段放在一个函数中,并迭代cell array的function 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)
更简单的方法是逐行读取脚本文件并依次评估每一行。这假定您要运行的脚本不包含任何多行语句(例如for
,end
在不同的行上,或者语句使用{{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
。