Поток управления управляющей структурой trycatchfinally

У меня есть блок try...catch...finally, catch которого повторно выдает исключение:

try
{
    startBombCountdownAndRunAsFastAsYouCan();
}
catch (BombExplodedOnYourFaceException ex)
{
    displayMessage("Hahaha! It blew up on your face!");
    throw ex;
}
finally
{
    cleanFloor();
}

displayMessage("Wow, you pulled it off!");

В этом примере мне нужно, чтобы cleanFloor() выполнялось независимо от того, было выброшено исключение или нет. Таким образом, возникает вопрос: выполняется ли предложение finally всегда, независимо от того, выдается ли повторно исключение в соответствующем предложении catch?


person pyon    schedule 11.03.2011    source источник
comment
Это на каком языке? Могут быть тонкие различия между поведением на разных языках.   -  person Ezra    schedule 11.03.2011
comment
Особо языка нет. В моей реальной программе я использую С#. (И я ненавижу каждую минуту этого.)   -  person pyon    schedule 11.03.2011


Ответы (3)


Да, именно для этой цели и была создана концепция finally.

person skaz    schedule 11.03.2011

Да, блок finally всегда будет выполняться.

Кроме того, в качестве примечания, если вы не собираетесь использовать явно перехваченное исключение, вы должны просто использовать "catch {... throw;}.

Для справки:

http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx

person Brandon Moretz    schedule 11.03.2011

finally обычно выполняется, но не всегда.

Рассмотрим следующую программу на Java, в которой блок finally не выполняется:

package test;
public class TestFinally {
    public static void main(String[] args) {
        try {
            throw new Exception ("throw!");
        }
        catch(Exception ex) {
            System.out.println("catch!");
            System.exit(0);
        }
        finally {
            System.out.println("finally!");
        }       
    }
}

Он выводит:

catch!

Улов finally будет выполнен только в том случае, если управление когда-либо будет возвращено catch, что, как мы видим, никогда не гарантируется; определение того, выполняете ли вы finally, в основном сводится к Проблеме остановки.

На практике обычно выполняется блок finally. Не всегда.


В статье Питера Норвига Java IAQ: вопросы с нечастыми ответами есть немного по этому поводу:

В: Код в предложении finally никогда не перестанет выполняться, верно?

Ну, вряд ли когда-нибудь. Но вот пример, когда код finally не будет выполняться независимо от значения логического выбора:

try {
    if (choice) {
        while (true) ;
    } else {
        System.exit(1);
    }
} finally {
    code.to.cleanup();
}
person Ezra    schedule 11.03.2011
comment
В своем вопросе я предполагал, что поток управления выйдет из части try конструкции try...catch...finally. И я также предполагал, что моя программа не завершится аварийно. - person pyon; 11.03.2011