Выполняет ли обработка отката исключение до того, как возникло исключение? - PullRequest
6 голосов
/ 28 июня 2011

Представьте, что у меня есть такой метод

void myMethod(MyThing t) throws MyException {
   t.foo = "bar";
   if (t.condition()) { 
      throw new MyException();
   }
}

Если сработало исключение, возвращается ли значение t.foo к тому, что было раньше?Или оно сохраняет значение "bar"?

Ответы [ 4 ]

9 голосов
/ 28 июня 2011

Значение свойства foo вашего объекта MyThing не будет возвращаться ни при каких исключениях.

В вашем примере нет блока try, но если он есть, вы можете выполнить свой собственный типотката значения в соответствующем блоке catch.

try {
    t.foo = "bar";
    doSomethingRiskyWhichMightThrowMyException();
} catch(MyException e) {
    t.foo = "rolledbackvalue";
}
3 голосов
/ 28 июня 2011

Значение не изменится на предыдущее значение. Фактически это то, что вы должны делать в блоке catch. Если возникает исключение этого типа, вы можете повторно инициализировать значение в блоке catch. Попробуйте использовать блоки catch, чтобы вы могли выполнять операции, чтобы вы не попали в ловушку навсегда. Что нужно сделать, откатить или нет в случае такого исключения - это полностью решение программиста.

3 голосов
/ 28 июня 2011

Throwing / catching исключения не автоматически подразумевает любую операцию отката.

Если переменная foo была изменена до того, как было сгенерировано исключение, значение также останется измененным и в дальнейшем.

2 голосов
/ 02 июля 2011

Любой код следует последовательному шаблону.т.е. Первое утверждение Первое и так далее (если только у вас нет циклов для повторения операторов или операторов goto для пропуска или повторения блоков).В вашем примере, после того, как он сгенерирует исключение, управление выполнением перейдет в обработчик исключений Java (поскольку вы не написали код обработки исключений через блоки try-catch) и, наконец, внезапно завершится.Таким образом, он ни в коем случае не «проследит» свой путь и не вернется к восстановлению значения t.foo.Остается только строка "bar". Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...