通常、私は低レベルの例外を高レベルのより意味のある例外でラップします。これは通常、より多くの作業ですが、レイヤー間のデカップリングを提供します。
たまたまデータベースから読み取る構成サブシステムを作成していると想像してください。ラップしないと、次のようになります。
public String getConfigurationProperty(String name) throws SQLException {
// Try to read from my configuration table
}
ラッピングをすれば
public String getConfigurationProperty(String name) throws ConfigurationException {
try {
// Try to read from my configuration table
} catch (SQLException ex) {
ConfigurationException wrapper = // Some subclass of ConfigurationException that wraps ex
throw wrapper;
}
}
これは間違いなくより多くの作業です。利点は、後で構成バックエンドを、ラッパーなしでファイルベースのバックエンドに変更したい場合、メソッドが次のようになることです。
public String getConfigurationProperty(String name) throws IOException {
// Try to read from my configuration file
}
そして、sではなくsを処理するように、すべてのクライアントコードを変更する必要があります。ラッピングを行う場合は、バックエンドを変更するだけで済みます。これは、クライアントコードがすでにsとそのサブクラスを念頭に置いて記述されているためです。これは、チェックされた例外とチェックされていない例外のどちらを使用するかとは無関係であることに注意してください。例外処理を行う場合は、ほとんどの場合、処理する例外のタイプの少なくともある程度の概算を知る必要があります。IOException
SQLException
ConfigurationException
さて、これは私がしがちなことです。ほとんどの例外はとにかく適切に処理できないと考える人がいて、これらすべてのラッピングはほとんどの場合ナンセンスです。
public String getConfigurationProperty(String name) throws ConfigurationException {
try {
// Try to read from my configuration file
} catch (IOException ex) {
ConfigurationException wrapper = // Some subclass of ConfigurationException that wraps ex
throw wrapper;
}
}