2017-01-14 33 views
1

是否有一種簡單的方法來配置MATLAB腳本,以便在遇到未處理的異常時退出(而不是恢復到REPL)?腳本可以配置爲「退出未處理的異常」?

原因是當在(無監督)批處理模式下執行腳本的許多運行時,任何失敗的腳本都應該立即退出,並且不會在無人蔘與的交互提示下無限地掛起。

重要的澄清:這個腳本的目的是從Unix命令行執行,而不是從MATLAB交互式提示符執行。更具體地講,劇本與

matlab -nodesktop -nosplash -nojvm -r myscript.m 

腳本應該始終終止MATLAB它已執行所有的代碼之後,並返回一個狀態代碼反映它的成功(0)或失敗(一些非調用零整數)。


我正在尋找一個全局設置(或命令行標誌),可以付諸實施,而不會影響代碼的其餘部分。

因此,我正在尋找類似於某些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); 

...但是,正如我上面所說的,我尋找簡單的東西,對代碼沒有或至多是最小的影響。

+2

甲'try' /'catch'對是做到這一點的唯一方法在外部文件中做到這一點。請注意,'exit'完全退出了MATLAB。你*可以*把腳本放在其他地方,並在你有「腳本的身體」的地方通過名稱來調用它,而不是修改腳本本身。另外,除非您啓用了'dbstop if error',否則您不應該獲得有關錯誤的交互式提示。你可以通過'dbclear'來禁用它。 – Suever

回答

2

發生未處理的異常時的默認行爲是關於錯誤的信息將被打印到命令窗口並且控件將返回到命令窗口。除非您已通過dbstop if error明確啓用它,或者在catch塊中有keyboard命令有try/catch命令,否則不應該從錯誤中獲得交互式提示。爲了得到一個簡單的錯誤而不是交互式提示,你可以使用dbclear if error來禁止這種行爲。我會檢查你的啓動文件,以確保你沒有dbstop if error

A try/catch對確實是這樣做的唯一方法。你可以做的是用另一個文件將你的電話打包到你的腳本中,並將電話轉到try/catch區塊中。這有附加的好處,你不必修改腳本本身,只是「跑步者」。

你也不想使用exit,因爲它完全退出了MATLAB。

your_script.m

disp('Doing my thing') 
error('Throwing an error!') 

calling_script.m

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 

更新

基於澄清您提供的要運行這個在Unix命令行中,您仍然希望使用類似try/catch語句與exit結合的語句。再次,可以如上所示

calling_script.m

code = 0; 

try 
    your_script 
catch ME 
    fprintf(2, 'CAUGHT EXCEPTION:\n'); 
    fprintf(2, '%s(%d): %s\n', ME.stack.file, ME.stack.line, ME.message); 
    code = 1; 
end 

exit(code) 
+0

謝謝。在閱讀你的答案後,我意識到我的問題需要包括一個重要的澄清;我剛剛添加了它。簡而言之:腳本應該始終從Unix命令行中調用,而不是從MATLAB的命令窗口中調用。 – kjo

+0

@kjo你仍然需要做類似的事情。我已經在更新中顯示了上述解決方案的替代方案。 – Suever