2009-08-27 14 views
2

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を設定する方法はありますか?

+0

あなたのCATCH文で何をしているのか? THROWまたはRETHROWを使用していますか、他に何かしていますか? – gnovice

+0

通常は、エラーメッセージを再フォーマットして「\ r」を削除してから再スローします。実際のエラー処理ロジックは、制御フローの上位に表示されます。 –

答えて

0

FORMATコマンドを使用すると表示が改善されますか?これは、よりコンパクトな形式で変数を表示するのに役立ちます。

format compact 

エラーメッセージをよりコンパクトな形で表示するのに役立ちます。

+0

恐れはありません。エラーメッセージは、コンパクトまたはルーズの形式で表示されます。 –

1

MATLABランタイムがJava例外をインターセプトすると、MExceptionでラップするときにシステム行のエンディングが使用されます。それを回避するために、あなたは、このようなのprintStackTrace()のように、別のスレッドで例外をスロー、またはstderrに直接スタックトレースを送信することができます

もちろん
public class Bummer { 
public static void a() { b(); } 
public static void b() { c(); } 
public static void c() { d(); } 
public static void d() { new RuntimeException("bummer").printStackTrace(); } 
} 

が、取得するために非常に悪いですMATLABのJava例外です。実際に例外的ではない例外に対して例外を使用している場合は、MExceptionでラップすることを検討して、ユーザーに役立つことがあります。

例外を使用してJavaコードをデバッグしている場合は、ほとんどのJava IDEのスタックトレース解析機能が余分な改行をうまく処理できることがわかります。

1

てみ設定:

java.lang.System.setProperty('line.separator', sprintf('\n'));