そもそもこのように try-catch ブロックをネストする必要があると仮定すると、これに問題はありません。Maroun の答えは、あなたが提供した例に適しています。あなたが提案したアプローチがより適している例は、「カーソル」のクリーンアップに多くのローカル変数が含まれている場合です。
openDatabaseConnection();
try {
Cursor cursor = openCursor();
CursorHelper helper = new CursorHelper(cursor);
String cursor_id = cursor.getId();
String something_else = cursor.getSomethingElse();
try {
useCursor(cursor_id, something_else, helper);
} finally {
closeCursor(cursor_id, something_else, helper);
}
} catch (Exception e) {
genericLogError();
} finally {
closeDatabaseConnection();
}
親の try ブロックは、ネストされたブロックによってスローされた例外をキャッチしますが、ネストされたfinally
ブロックが最初に呼び出されます。try/catch
これにより、最初のブロック内にカプセル化されたカーソル変数のスコープが保持されます。
このすべてのコードを 1 つのtry/catch
ブロックにまとめたい場合は、一部の変数をブロックの外で宣言する必要があり、可読性に影響を与える可能性があります。
openDatabaseConnection();
CursorHelper helper = null;
String cursor_id = null;
String something_else = null;
try {
Cursor cursor = openCursor();
helper = new CursorHelper(cursor);
cursor_id = cursor.getId();
something_else = cursor.getSomethingElse();
useCursor(cursor_id, something_else, helper);
} catch (Exception e) {
genericLogError();
} finally {
if (cursor_id != null) {
closeCursor(cursor_id, something_else, helper);
}
closeDatabaseConnection();
}