Пустые catch блоки это плохо? Вот упрощенный вариант того, как я использую Try-Catchclass Database { public void addRow() throws SQLException { try { /* Add row */ } catch(SQLException e) { log.error(e); throw e; } } } class Context1 { public void doSomething(Database db) throws SQLException { db.addRow(); //If throws exception then main exception handler executes sendMessage("failed"); sendMessage("success"); } } class Context2 { public void doSomething(Database db) { try { db.addRow(); } catch (SQLException ignored) {} } } Мне хотелось бы исключить перевыбрасывания исключений, дабы избежать пустые catch блоки во второй ситуации, когда уведомлять нигде, кроме консоли не нужно, но тогда становится невозможным обработка первой ситуации, когда необходимо уведомить пользователя о невыполненной операции. Как быть в такой ситуации?
Если вам необходимо обработать исключение в первой ситуации, но при этом избежать пустых catch блоков во второй ситуации, можно использовать такой подход:
В классе Database измените метод addRow() так, чтобы он не перевыбрасывал исключение SQLException, а вместо этого возвращал boolean значение в зависимости от успешности операции:class Database { public boolean addRow() { try { /* Add row */ return true; } catch (SQLException e) { log.error(e); return false; } } }В классах Context1 и Context2 проверяйте результат выполнения метода addRow() и уже там принимайте решение об уведомлении пользователя:class Context1 { public void doSomething(Database db) { if(db.addRow()) { sendMessage("success"); } else { sendMessage("failed"); } } } class Context2 { public void doSomething(Database db) { db.addRow(); // не надо перехватывать SQLException // дальнейшие действия в зависимости от результата можно реализовать здесь } }
Таким образом, вы избежите пустых catch блоков второй ситуации, а также сможете обрабатывать исключения и уведомлять пользователя в первой ситуации.
Если вам необходимо обработать исключение в первой ситуации, но при этом избежать пустых catch блоков во второй ситуации, можно использовать такой подход:
В классе Database измените метод addRow() так, чтобы он не перевыбрасывал исключение SQLException, а вместо этого возвращал boolean значение в зависимости от успешности операции:class Database {public boolean addRow() {
try {
/* Add row */
return true;
}
catch (SQLException e) {
log.error(e);
return false;
}
}
}В классах Context1 и Context2 проверяйте результат выполнения метода addRow() и уже там принимайте решение об уведомлении пользователя:class Context1 {
public void doSomething(Database db) {
if(db.addRow()) {
sendMessage("success");
} else {
sendMessage("failed");
}
}
}
class Context2 {
public void doSomething(Database db) {
db.addRow(); // не надо перехватывать SQLException
// дальнейшие действия в зависимости от результата можно реализовать здесь
}
}
Таким образом, вы избежите пустых catch блоков второй ситуации, а также сможете обрабатывать исключения и уведомлять пользователя в первой ситуации.