2011-03-01 19 views
3

Matlabスクリプトはすべて独立して実行できるいくつかのセルから構成されています(別のマクロを実行するには1つのセルを実行する必要がありますが、作業領域をクリアしてください。最初のセルを実行せずに2番目のセルを再実行する必要があります)。これらのセルのコードは(もちろん)失敗することがあります。その場合は、特定のコマンドを実行したいと思います。Matlabでtry/catchなしでエラーが発生した場合に指定されたコマンドを実行

コードは複数の独立したセルにまたがっているので、try/catchブロックを使用してこれを実行することはできません。各セルはかなり短く(関数呼び出しを含む数行)、すべてのセルにtry/catchブロックを導入すると、おそらくスクリプトの長さが2倍になります。

具体的には、最初のセルにログファイル(diary filename.log)を開きます。このファイルは、任意のセルからエラーが発生した(およびログに記録された)後に自動的に閉じます(およびdiary off)。この設定は、少なくともログファイルが再び閉じるまで有効にする必要があり、プログラムで設定する必要があります(ログファイルを開く同じセルに設定したい)。

どうすればよいですか?

+0

コードが失敗するのはなぜですか?これらの境界を設定できると仮定して、あなたのコードをサポートするif文を置き換えることはできますか? –

+0

このセルラアーキテクチャをコードに使用する理由はありますか?おそらく、私がセル・モードについて理解していないものがあるかもしれませんが、私はいつもプロトタイプ・コマンドを手助けするためのツールと見ていました。好きなものがあれば、それを関数にカプセル化する必要があります。 – Miebster

+0

私はセル構造を使用してコードの一部を何度も繰り返し、他の(遅い)タスクを一度実行するだけで済むようにします。この具体的なケースでは、私は最初に3Dジオメトリを構築し(遅い)、いくつかのパラメータを変更しながらCTスキャンを(より速く)シミュレートします。コードの完成度にかかわらず、それぞれの実行をログに記録したいと思いますが、それぞれが別のログファイルになるようにしたいと思います。タイムスタンプの後に名前が付けられたシミュレーションの開始時にログを開きますが、コードが失敗した場合は、問題を修正するために日記を閉じたいと思います。 –

答えて

0

コードをスクリプトとして保存する場合は、各セルの周りにtry/catchブロックを配置することをお勧めします。

それ以外の場合は、スクリプトをラップする関数を作成できます。関数の構文では、 'dbstop if error'を設定することができます。これにより、変数を検査して何が問題になったのかを特定できるエラーでコードの実行が停止します。

function output = run(listOfCells,input) 
%#RUN evaluates the cells listed in listOfCells 

try 

diary filename.log 

if any(listOfCells==1) 
%# evaulate cell 1 

end 

if any(listOfCells==2) 
%# evaluate cell 2 

end 

... 

catch 
%# close the diary in case of error 
diary off 
end %# try 
+0

これはどのように実行するのですか? 'run([1 2 4]、 'my_script_name.m')'やその他の方法で呼び出すことができますか? –

+0

@Tomas Lycken:セル#1を最初のif節に、セル#2を2番目のif節にコピーペーストします。関数に必要な入力引数を渡すことを忘れないでください。もし入力が 'a'、' b'、 'c'なら'out = run([1 2 4]、a、b、c)'と呼ぶでしょう。 – Jonas

+0

私はおそらくこれを使用しません。代わりに手動で日記をオフにすることを覚えておいてください)、Matlabには私が望むfuncitonalityはないようですので、これはおそらく最良の回避策の1つです。 –

関連する問題