SQLExceptionについて

下で、「予期できる」か「予期できない」でエラー処理の方針を分けると書いたけれど、そうするとSQLExceptionみたいな例外の扱いについて気になる。単純にSQLExceptionといってもエラーの内訳は

  • テーブルorビューが無い(予測不能
  • 一意制約エラー(予測可能か微妙)
  • データ型エラー(予測可能)
  • SQL文法エラー(予測可能)
  • その他のエラー(予測不能

と、メソッド内で処理できるエラーとできないエラーがあるわけで、これを一緒くたに呼び出し元に投げても困るわけだ。
これはもうcatch節で例外の詳細を見て対応してやるしかないんだろうか。

catch(SQLException exp) {
 if( exp.Number = 1 ) { // 一意制約エラー
   // 該当レコードを削除して再登録する処理
 } else {
   throw new DBAccessException("DB操作のエラーが発生", exp);
 }
}

みたいにしてやるしかないのかなぁ。イマイチ美しくない気もするけれど。