Распространение исключений через вложенные циклы / вызовы - PullRequest
1 голос
/ 27 октября 2010

Мне трудно понять, как должны распространяться исключения.Мой код (очень похожий на общий код ниже) выполняет otherCode() и не может continue outer, когда doSomething() выдает исключение.Мне нужно зациклить анализ группы файлов, некоторые из которых могут быть отформатированы неправильно (вызывая исключение), а затем зациклить проанализированные данные, что также может привести к исключению (например, файл имел правильный формат, но отсутствует поле),Когда возникают эти исключения, циклы должны продолжаться на остальных полях / файлах.
Мои вопросы о путанице / неопределенности обозначены вопросами в комментариях ниже (через?).

...
public static void main(string[] args) {
   outer: while ( thingsToDo ) {
       try{
           someItrType someIterable = doSomething(); // might throw
           otherCode();  // only do this if nothing was thrown above?
       } catch (SomeExceptionType e) {
           handleSomeExceptionType();
           continue outer; // keep trying the rest of the loop?
       }
       otherOtherCode(): // only if nothing thrown, because of the continue?
       inner: while( someIterable.next() ) {
            try{
                doSomethingElse();  // might throw
            } catch (SomeExceptionType e) {
                handleSomeExceptionType();
                continue inner; // keep trying the inner loop?
            }
            doThisIfAllOkay();  // only if no exceptions thrown?
        }
    }
}

Я также не понимаю распространение через вложенные вызовы, например, если doSomething() вызывает nextMethod(), что, в свою очередь, вызывает nextNextMethod() и любое из этих исключений выброса, когда выполнение поймает в этих методах по сравнению с попыткойблокировать вокруг doSomething()?Например, если эти методы throw new содержат try-catch или не имеют обработки ...

1 Ответ

3 голосов
/ 27 октября 2010

Когда в блоке try возникает исключение, оно немедленно вызывает перемещение программы в блок catch.Любой код после исключения, произошедшего в блоке try, не будет выполнен.

Использование ключевого слова continue заставляет цикл переходить к следующей итерации, начиная с вершины цикла, поэтому любой код под перехватомБлок также не будет выполняться.

Что касается вложенных функций:
Существует 2 варианта обработки исключений.Либо вы справляетесь с этим самостоятельно, либо заявляете, что ваша функция может генерировать исключение (этого конкретного типа).Предполагая, что каждая отдельная функция в вашей программе объявляет, что она throws Exception, тогда исключение будет пузыриться из всего вашего кода вплоть до виртуальной машины Java, которая затем завершится.По сути, вложенные функции с исключением будут продолжать передавать их вверх по стеку, пока они не будут обработаны в блоке try / catch.

...