Matlabでは、Mコードから呼び出されたJavaメソッドによってJava例外がスローされると、MatlabエラーまたはMExceptionに変換され、JavaスタックトレースがMExceptionのメッセージに含まれます。 Windowsでは、スタックトレースは二重に表示されます。ここに例があります。Matlabの二重スペースJavaスタックトレースエラー
package test;
public class Bummer {
public static void a() { b(); }
public static void b() { c(); }
public static void c() { d(); }
public static void d() { throw new RuntimeException("bummer"); }
}
これは、これを生成します。
>> test.Bummer.a()
??? Java exception occurred:
java.lang.RuntimeException: bummer
at test.Bummer.d(Bummer.java:8)
at test.Bummer.c(Bummer.java:7)
at test.Bummer.b(Bummer.java:6)
at test.Bummer.a(Bummer.java:5)
>> disp(find(lasterr == sprintf('\r')))
61 95 129 163 197
特に、20コールディープスタックがある場合は、読みやすくなります。
これは、エラーメッセージのstacktrace部分がDOSモードのCRLF(\ r \ n)行末で構成されているためです。これはWindowsマシンで意味があります。しかし、MatlabのコマンドウィンドウはUnixモードの一種で、\ r \ nを2つの改行に変換します。
私たちの現在の回避策は、このようなtry/catchガードコードをほとんどのJavaメソッド呼び出しで使用することです。
try
somejavaobject.SomeMethod();
catch err
rethrowmsg(err, 'Some additional details');
end
Rethrowmsgは()、私たちはmungesがする\ n \ r \ nを変換するために誤ることを書いた関数であるメッセージで詳細を内蔵し、その後、再スローを呼び出します。
回避策を追加するのはちょっと面倒ですが、除外される傾向があります。 "dbstop if all error"を実行している場合、その時点でのエラーの表示は修正されません。結局のところ、これはちょっと迷惑ですが、Matlabのコードを一日中デバッグするのに費やすと、それが足りなくなります。そして、私はJava例外/ MException統合メカニズムについて興味があります。
エラーメッセージテキストのstacktrace部分を\ n行区切り記号で構成してコマンドウィンドウに1行表示するようにMatlabを設定する方法はありますか?
あなたのCATCH文で何をしているのか? THROWまたはRETHROWを使用していますか、他に何かしていますか? – gnovice
通常は、エラーメッセージを再フォーマットして「\ r」を削除してから再スローします。実際のエラー処理ロジックは、制御フローの上位に表示されます。 –