脚本可以配置为"退出未处理的异常"?

时间:2017-01-14 14:01:12

标签: matlab

是否有一种简单的方法来配置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);

...但是,正如我上面所说的那样,我正在寻找一些简单的东西,对代码没有影响或影响最小。

1 个答案:

答案 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