= 例外処理 = クライアント側で発生した例外を放置しておくと、何のメッセージも出さずに単純に機能不全に陥いる。 Firebugのコンソールでこれを確認することはできるのだが、次の問題がある。 * ユーザ側でFirebugを開いて例外を確認することは困難。 * この際のスタックトレースは難読化されているので、意味不明。 以下では、クライアント側で例外が発生したら、それをサーバ側に送り、難読化を解除して適切なスタックトレースを表示させる方法を示す。 == ビルド・設定ファイルの変更 == === gwtcコンパイル持にシンボルマップを作成させる === 難読化解除のためには、シンボルマップ、つまり元の名前と変更された名前のマップが必要。 これはgwtcコンパイラに「-extra war/WEB-INF/classes/」という引数を指定してやる必要がある。 antで行っている場合は以下。 {{{ }}} === gwt.xmlファイルの変更 === 以下を追加する。 {{{ }}} == プログラムの変更 == === クライアント側 === {{{ public class Sample implements EntryPoint { @Override public void onModuleLoad() { // キャッチされていない例外のハンドリング GWT.setUncaughtExceptionHandler(new ClientExceptionLogger()); ... } ... private class ClientExceptionLogger implements GWT.UncaughtExceptionHandler { @Override public void onUncaughtException(Throwable th) { th = unwrap(th); StackTraceElement[]elements = th.getStackTrace(); // elementsをサーバ側に送信する。 // 例外オブジェクトそのものを送信しようとすると、色々面倒くさい。 } private Throwable unwrap(Throwable e) { if(e instanceof com.google.gwt.event.shared.UmbrellaException) { UmbrellaException ue = (com.google.gwt.event.shared.UmbrellaException) e; if(ue.getCauses().size() == 1) { return unwrap(ue.getCauses().iterator().next()); } } return e; } } }}} === サーバ側 === == 参考資料 == * [[http://www.summa-tech.com/blog/2012/06/11/7-tips-for-exception-handling-in-gwt/]] * [[http://stackoverflow.com/questions/13165680/unable-to-deobfuscate-gwt-stacktrace]]