У меня есть функция, которая зацикливается при выполнении чего-то, что может вызвать исключение. Выглядит примерно так:
public void myFunction() throws MyException {
while(stuff) {
try {
DoSomething() // throws an exception
}
catch (Exception ex) {
throw new MyException(some, stuff, of, mine, ex);
}
}
}
Ошибка, вызывающая исключение, исправима. Это может быть что-то вроде ошибки SQL в одном операторе обновления, когда цикл while выполняет серию операторов обновления. Или ошибка синтаксического анализа в одном фрагменте данных, когда цикл обрабатывает несколько фрагментов данных. Мне нужно передать исключение дальше по цепочке, чтобы часть программы с графическим интерфейсом могла обработать его, обработать и передать ошибку пользователю. Но я не хочу уничтожать цикл в этой конкретной функции. Другие вещи, которые он делает, могут быть недействительными. Ошибка, которая вызвала исключение, не может быть фатальной для функции.
Итак, мой вопрос таков: Является ли приемлемой практика для создания связанных списков пользовательских исключений (где каждое исключение является узлом, а выбрасываемое исключение является главой списка), а затем выбрасывает голову список (если есть) после завершения цикла?
Кто-нибудь когда-нибудь видел, чтобы это было сделано? Кто-нибудь может подумать о возможных проблемах с этим? Может кто-нибудь придумать другие, более эффективные способы решения основной проблемы: необходимость пропустить несколько несвязанных исключений без выхода из функции до тех пор, пока это не будет сделано?
Вот пример того, как связывание и бросок могут быть реализованы очень просто:
public void myFunction() throws MyException {
MyException head = null;
while(stuff) {
try {
DoSomething() // throws an exception
}
catch (Exception ex) {
MyException tmp = new MyException(some, stuff, of, mine, ex);
tmp.next(head);
head = tmp;
}
}
if(head != null)
throw head;
}