MyBatisのフレームワークでは、例外が発生したときに、位置決めが非常に明確である、例外クラスの数、例外クラスの非常に多くの定義は、それぞれが独立している異常がなければならない理由を定義します。そして、我々は通常、コードを書く、パスをいじりされ、定義された例外クラスは、主にカジュアルされている、またはJDKを使用し、時には直接例外を取得し、例外クラスを付属しています。明らかな欠点。将来の書き込みコードは、プロジェクトが異常な位置付けを与えられているとき、それははるかに簡単になるように、各サービス(またはシーン)は、個別にパッケージ異常が現れたことがありますが、MyBatisのに学ばなければなりません。
MyBatisの例外の父はIbatisException.classあるが、それはのRuntimeExceptionの息子です。これはなぜでしょうか?
1.例外例外やスロー、または治療。。。必須要件。。。
2.のRuntimeExceptionの例外、コンパイル時、私は間違って行くことはありませんかわからない、結果は,,,,実行する際に知ってZeyang扱うことはできませんが、間違っている、プログラムがシャットダウンされています。
具体的にどのような理由、私は知らないが、人々はMyBatisのようなものをやっているし、我々は、後でそれを取得し、その後のコードを書きます!!!
パブリック クラス IbatisExceptionが延びているのRuntimeExceptionを{ プライベート 静的 最終 長いのserialVersionUID = 3880206998166270511L 。 パブリックIbatisException(){ スーパー()。 } 公共IbatisException(文字メッセージ){ スーパー(メッセージ)。 } 公共IbatisException(文字列メッセージ、Throwableの原因){ スーパー(メッセージ、原因)。 } 公共IbatisException(Throwableの原因){ スーパー(原因)。 } }
MyBatisの父が異常と定義され、構造は4つの機能、すべてのコンストラクタのスーパー、およびそのサブクラスの例外のすべてを提供し、すべてのこのスタイルはそうです。仕事の後、聖歌が続きます!
仕事は、我々はまた、このルーチンMyBatisのを学ぶ必要がありますが、これらは異常MyBatisのコアモジュールではありません。2つのコアクラス、ExceptionFactory.classとErrorContext.classを提供MyBatisの、で。
名前が示すようにその役割はあります。その後、我々はその具体的な実現を見て、それは非常に興味深いです、今後の作業は、このルーチンを試してみてください。
1. ExceptionFactory.class
パブリック クラスExceptionFactory { プライベートExceptionFactory(){ // 防止スタン } パブリック 静的のRuntimeException wrapException(文字列メッセージ、例外e){ 戻り 新しいPersistenceException(ErrorContext.instance()メッセージ(メッセージ).cause(E).toString()、 E); } }
コンストラクタの民営化が、その後は静的メソッドで、それが異常な異常の情報と実際のオブジェクトを作成します。
注意:例外の種類はRuntimeException.classを返し、新しいはPersistenceException.classです。IbatisException.class MyBatisのは、クラスの時代遅れのバージョンのように高いマークが、IbatisException.class PersistenceException.classサブクラスであることになります。。。。。これは、物事の古い方法と互換性のあるコードの延長/アップグレード/バージョンのようです!!!!
しかし、私はExceptionFactory.classは、キーがErrorContext.instance()。メッセージ(メッセージ).cause(E).toString()コード句であるべきだと思います。私たちはErrorContext.classを見てみましょう
2. ErrorContext.class
パブリック クラスErrorContext { プライベート 静的 最終的な文字列LINE_SEPARATOR =はSystem.getProperty( "line.separator"、 "\ n" ); プライベート 静的 最終的にThreadLocal <ErrorContext> LOCAL = 新しいのThreadLocal <> (); プライベートErrorContextは、格納されました。 プライベート文字列リソース。 プライベート文字列の活性; プライベートStringオブジェクト。 プライベート文字列メッセージ。 プライベート文字列のSQL。 民間のThrowable原因。 プライベートErrorContext(){ } 公共の 静的ErrorContextインスタンス(){ ErrorContextコンテキスト = LOCAL.get()。 もし(コンテキスト== NULL ){ コンテキスト = 新しいErrorContext()。 LOCAL.set(コンテキスト)。 } 戻りコンテキスト; } パブリックErrorContextストア(){ ErrorContext newContextを = 新しいErrorContext()。 newContext.stored = この; LOCAL.set(newContextを)。 返すLOCAL.getを(); } パブリックErrorContextリコール(){ 場合格納されている(!= NULL){ LOCAL.set(記憶)。 格納され = NULL ; } を返す)(LOCAL.getします。 } パブリックErrorContextリソース(文字列リソース){ この .resource = 資源。 返す これを。 } パブリックErrorContext活性(文字列活性){ この .activity = 活性; 返す これを。 } パブリックErrorContextオブジェクト(Stringオブジェクト){ この .object = オブジェクト。 返す これを。 } 公共ErrorContextメッセージ(文字メッセージ){ この .message = メッセージ。 返す これを。 } パブリックErrorContextのSQL(文字列のSQL){ この .SQL = SQL。 返す これを。 } パブリックErrorContext原因(Throwableの原因){ この .cause = 原因。 返す これを。 } パブリックErrorContextリセット(){ 資源 = NULL ; 活動 = nullを。 オブジェクト =ヌル; メッセージ = NULL ; SQL = nullを。 原因 = nullを。 LOCAL.remove(); 返す これを。 } @Override パブリック文字列のtoString(){ StringBuilderの説明 = 新規のStringBuilder(); // メッセージ であれば(これ!.message = ヌル){ description.append(LINE_SEPARATOR)。 description.append( "###" ); description.append(この。メッセージ); } // リソース 場合(リソース!= NULL ){ description.append(LINE_SEPARATOR)。 description.append(「###エラーがで存在することができます」)。 description.append(リソース); } // オブジェクト であれば(!物体= NULL ){ description.append(LINE_SEPARATOR)を、 description.append( "###エラーが伴うこと" ); description.append(オブジェクト)。 } // アクティビティ なら(活性!= NULL ){ description.append(LINE_SEPARATOR)。 description.append( "###エラーがしばらく発生しました" ); description.append(活性)。 } // アクティビティ 場合(!SQL = NULL ){ description.append(LINE_SEPARATOR)。 description.append( "### SQL:" ); description.append(sql.replace( '\ n'は、 ' ').replace(' \のR'、 ' ').replace(' \ tの'、 '' ).trim())。 } // 起こす 場合(!原因= ヌル){ description.append(LINE_SEPARATORを)。 description.append( " 説明。 } を返す)(description.toStringします。 } }
プライベート静的最終的にThreadLocal <ErrorContext>新しい= LOCALのThreadLocal <>();以下がより奇妙であるので、そのコード行を見て、すぐには少しのThreadLocalにこのクラスを使用するためにグルジアを強制的に感じたし、解決すべき一般的にスレッドの安全性の問題があります。MyBatisのは、この問題を考慮する必要がありますか?それは変数それのように多くのメンバーを持っているので、おそらく実際に、それを必要とします!
表面的理解が、ルーチンは学ばなければなりません!!!
例外の独自のプロジェクトについて、単に嫌だと思います!!!