SQLException javadocsを見ると、getCause
とgetNextException
の間に重なりがあるようです。最初はThrowableを返しますが、それ以外の場合はかなり互換性があるようです。SQLExceptionでgetCauseとgetNextExceptionの違いはありますか?
2つの違いは何ですか? JDBCドライバを開発する際に、例外チェーン機構として互いを選択する際のガイドラインはありますか?
SQLException javadocsを見ると、getCause
とgetNextException
の間に重なりがあるようです。最初はThrowableを返しますが、それ以外の場合はかなり互換性があるようです。SQLExceptionでgetCauseとgetNextExceptionの違いはありますか?
2つの違いは何ですか? JDBCドライバを開発する際に、例外チェーン機構として互いを選択する際のガイドラインはありますか?
方法getCause()
は、その具体的な原因の原因を示します(SQLException
)。一方、処理中には、複数の例外が発生する可能性があります。バッチ処理、複数のクエリパラメータのサーバサイドエラー(長すぎる、変換エラーなど)が考えられます。
これらの複数の例外は同じレベルにあります(互いに重複しないため)SQLException
のチェーンに追加されます。このチェーンの先頭はスローされる例外です。チェーン内の他のSQLException
に移動するには、getNextException()
を使用します。一方、例えば
try {
// Something that produces multiple SQLExceptions
} catch (SQLException e) {
SQLException current = e;
do {
// do something with current
} while ((current = current.getNextException()) != null)
}
、SQLException
はまた、(/ JDBC4のJava 6で導入された)方法public Iterator<Throwable> iterator()
、この各SQLException
を反復し、チェーン内の次のSQLException
に進む前にその原因を有しています。
SQL操作は、いくつかの独立した理由で失敗する可能性があります。たとえば、複数の行を更新しようとする可能性があり、3つの行が存在しない可能性があります。これらの3つの失敗は独立しています。ここではgetNextException()
が適切です。例外を構築するときは、setNextException()
を使用できます。データベースに話したときに一方
は、IOException
があったので、全体の操作がを失敗した場合、それは根本的な原因だ - IOException
が発生したため、SQLException
が発生した唯一の理由でした。それはgetCause()
が適切な場所です - SQLException
を作成するときに、コンストラクタの原因を渡します。
特に、バッチステートメントの場合、SQLステートメントの実行によって多くのSQLExceptionが生成されることがあります。 1つのバッチに10行を挿入し、2つが失敗したとします。バッチが失敗したことを示す例外が1つあり、getNextExceptionメソッドを使用して詳細にアクセスする必要があります。これはデータベースドライバに依存するかもしれません。
IOの例外またはSQLExceptionによって引き起こされたアプリケーション固有の例外をスローするなど、ある例外を別のものにラップするときに、例外の原因が使用されます。