выполнение очистки и передача исключения вызывающей стороне - PullRequest
0 голосов
/ 29 января 2011

Мне нужно выполнить некоторую инициализацию и очистить ее в случае каких-либо исключений.Я все еще хотел бы, чтобы исключение было передано вызывающей стороне.Проблема в том, что теперь я должен объявить этот метод как throws Throwable, а затем я должен явно обработать этот метод в вызывающем объекте, как если бы все процедуры уже не вызывали Throwable неявно.Глупо, не правда ли?


try {
  init_step1();
  init_step2();
}
catch (Throwable th) {
  clean();
  throw th;
}

Ответы [ 3 ]

1 голос
/ 29 января 2011

Один из способов сделать это - выполнить очистку в блоке finally, заметив, произошло ли исключение, если вы действительно достигли конца блока try или нет:

boolean success = false;
try {
    // Stuff here
    success = true;
} finally {
    if (!success) {
        clean();
    }
}
0 голосов
/ 29 января 2011

@ Решение Джона Скита - самое чистое. Еще одно решение, которое может вас заинтересовать.

try {
    // Stuff here
} catch(Throwable t) {
    clean(t);
    // bypasses the compiler check
    Thread.currentThread().stop(t); 
}

Я бы предложил использовать этот подход только в том случае, если вам нужно знать, какое исключение выдается. например Для ресурсов, которые у меня закрыты, я записываю исключение, которое вызвало их закрытие. Таким образом, если я пытаюсь использовать ресурс, и он закрыт, я могу понять, почему он закрыт.

private void checkClosed() {
    if (closed)
        throw new IllegalStateException("Closed", reasonClosed);
}
0 голосов
/ 29 января 2011

Глупый борется с проверенными исключениями.Вы должны бросить что-то другое, если вы не хотите требовать от каждого звонящего справиться с этим.просто сгенерируйте исключение RuntimeException

public void myMethod() throws RuntimeException {
    try {
      init_step1();
      init_step2();
    }
    catch (Throwable th) {
        clean();
        throw new RuntimeException(th);
    }
}

Почему вы все равно ловите Throwable на первом месте?init_step1 () и init_step2 () не выдают исключение?

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