是否有一种简单的方法来配置MATLAB脚本,以便在遇到未处理的异常时退出(而不是恢复到REPL)?
这样做的原因是,在(无监督)批处理模式下执行多次脚本运行时,任何失败的脚本都应立即退出,并且不会无限期地挂起(无人值守)交互式提示。
重要的澄清:此脚本应从Unix命令行执行,而不是从MATLAB交互式提示符执行。更具体地说,该脚本将使用
调用matlab -nodesktop -nosplash -nojvm -r myscript.m
脚本在执行完所有代码后总是终止MATLAB,并返回反映其成功(0)或失败(某些非零整数)的状态代码。
我正在寻找可以在不影响其余代码的情况下生效的全局设置(或命令行标志)。
IOW,我正在寻找类似于某些Unix shell(例如bash,zsh)中可用的-e
标志的东西,它会在语句返回状态时立即中止脚本非零(意味着语句失败)。
我知道我可以使用try-catch
包装整个脚本,就像这样(例如):
try
exit_code = 0;
%
% BODY OF SCRIPT
%
catch exc
fprintf(2, 'CAUGHT EXCEPTION:\n');
fprintf(2, '%s(%d): %s\n', exc.stack.file, exc.stack.line, exc.message);
exit_code = 1;
end
exit(exit_code);
...但是,正如我上面所说的那样,我正在寻找一些简单的东西,对代码没有影响或影响最小。
答案 0 :(得分:2)
发生未处理的异常时的默认行为是,有关错误的信息将打印到命令窗口,控件将返回到命令窗口。您不应该从错误中获得交互式提示,除非您已使用dbstop if error
明确启用它,或者try
/ catch
中带有keyboard
命令{1}}阻止。要获得普通错误而不是交互式提示,您可以使用dbclear if error
来禁用此行为。我会检查你的启动文件,以确保你没有catch
。
dbstop if error
/ try
对真的是唯一能做到这一点的方法。您可以做的是用另一个文件将调用包装到脚本中,并将调用放在catch
/ try
块中。这样做的另一个好处是,您无需修改脚本本身,只需修改“runner”。
此外,您不希望使用catch
,因为它完全退出MATLAB。
<强> exit
强>
your_script.m
<强> disp('Doing my thing')
error('Throwing an error!')
强>
calling_script.m
<强>更新强>
根据您提供的说明,您希望从Unix命令行运行此操作,您仍然希望使用与for k = 1:100
try
% Call your other script and hope for no errors!
your_script
catch ME
% Print information about the error and continue
fprintf(2, 'CAUGHT EXCEPTION:\n');
fprintf(2, '%s(%d): %s\n', ME.stack.file, ME.stack.line, ME.message);
end
end
/ try
语句结合的类似内容{ {1}}。同样,您可以在外部文件中执行此操作,如上所示
catch
exit