Возьмите ситуацию, когда вы пишете библиотеку для объектов, предназначенных для асинхронного запуска.Чтобы уведомить вызывающую сторону о состоянии асинхронного объекта, вызывающая сторона должна реализовать интерфейс слушателя.
Теперь при использовании слушателей есть вероятность, что слушатель сделает что-то не так, что приведет к исключениюброшенный в объект библиотеки.
Пример
public interface SomeListener {
public void progressNotification(int status);
}
public class SomeClass {
SomeListener listener = null;
…
public void setListener(SomeListener listener) {
this.listener = listener;
}
…
public void someRandomMethod() {
int progressStatus = 0;
//Do some stuff here that updates progressStatus
//then notify the caller
if (listener != null) {
listener.progressNotification(progressStatus);
}
}
}
public class CallerClass implements SomeListener{
public void progressNotification(int status) {
//do something that will throw an exception
//e.g assume status is 0
int x = 200/status; //this will throw an ArithmeticException because of division by zero
}
}
Если SomeClass
не перехватит исключение и не обработает его, это приведет к тому, что любой код после listener.progressNotification(progressStatus);
не будет выполненоставив объект в «неправильном» состоянии.
Итак, мой вопрос: как лучше всего справиться с такого рода исключениями в библиотеке?
Я видел одну библиотеку, которая делаетэто:
if (listener != null) {
try {
listener.progressNotification(progressStatus);
}catch (Thrwowable th) {
System.err.println("An uncaught throwable " + th);
}
}
, что мне не подходит.