На ум приходит как минимум два подхода, которые обычно будут объединены в зависимости от того, что вы хотите foo
сделать:
1.Поймать и отбросить только соответствующие исключения
Существует только очень много исключений, которые может выдать код в вашем основном потоке (вероятно, в основном SqlException
с).Так что только ловите и отбрасывайте их, и заявляйте, что вы делаете это.Более того, перебрасывайте только те, которые вы на самом деле не обрабатываете (в вашем упрощенном примере кода вы не обрабатываете ничего, но ваш реальный код, вероятно, более тонкий).
Имейте в виду, некоторыеиз исключений могут быть исключения во время выполнения, и поэтому вы можете захотеть объединить это с приведенным ниже.
2.Совсем не поймайте исключение
Примерно так:
// Signature changes to include any exceptions that really can be thrown
public void foo() throws XYZException, ABCException {
// A flag indicating that the commit succeeded
boolean done = false;
begin();
try {
// Don't have any `return` statements in here (or if you do,
// set `done` to `true` first)
...
commit();
done = true; // Commit didn't throw an exception, we're done
} finally {
// finally clause always happens regardless
if (!done) {
// We must be processing an exception; rollback
try {
rollback();
} catch (Exception e) {
// quash it (e.g., leave this block empty), we don't want
// to mask the real exception by throwing a different one
}
}
}
}
Естественно, ваша подпись должна включать любые исключения, которые могут быть выброшены в основном потоке, но вы пытаетесь это сделатьделать, если я вас правильно понимаю.
Опять же, вы вполне можете объединить эти два подхода, потому что вы можете обрабатывать некоторые исключения, а не другие.