Попробуй, наконец, блок

try
{
    operation1();
    operation2();
    ...
}
finally
{
    try
    {
        finalizer_operation1();
        finalizer_operation2();

    }
    finally
    {
        very_critical_finalizer_operation_which_should_occurs_at_the_end();
    }
}

Это нормально? Чтобы финализатор был еще одним блоком try/finally (потому что finalizer_operationX() может выбросить, и я должен убедиться, что very_critical...() произойдет в конце.

Быстрый поиск в Google для try in finally block ничего не дает (удалит вопрос, если вы дадите мне повторяющуюся ссылку), он должен работать, но я не уверен в дизайне и возможных проблемах с Это.


person Sinatr    schedule 12.11.2014    source источник
comment
Это должно быть нормально, просто имейте в виду, что раздел finalize выполняется всегда, даже если у вас есть оператор return в разделе catch   -  person yonutix    schedule 12.11.2014
comment
Я не вижу проблем. Например, если вы вызываете какой-то метод из блока finally, который, в свою очередь, содержит свои собственные блоки try-finally - ничего особенного. В вашем случае это происходит тем же методом.   -  person Alex F    schedule 12.11.2014
comment
@CosminMihai, у меня здесь нет раздела catch;)   -  person Sinatr    schedule 12.11.2014


Ответы (2)


Я бы не стал так писать код. Я не люблю вкладывать конструкции try / catch / finally. Я предпочитаю по одному на каждый метод.

Я предпочитаю заключать каждый из этих вызовов в отдельный метод.

try
{
    operation1();
    operation2();
    ...
}
finally
{
    cleanup();
}

public void cleanup() {
    try
    {
        finalizer_operation1();
        finalizer_operation2();

    }
    finally
    {
        very_critical_finalizer_operation_which_should_occurs_at_the_end();
    }
}
person duffymo    schedule 12.11.2014
comment
Я бы сделал это, но в моем случае операции и finalizer_operations используют одни и те же локальные переменные (определенные в первом try), поэтому перенос кода в новый метод проблематичен. - person Sinatr; 12.11.2014
comment
@Sinatr есть непонятная концепция method parameters - person decPL; 12.11.2014
comment
@decPL, да, но если что-то изменится, мне придется редактировать параметры и т. д. Я думаю, что передача параметров скрывает логику управления намного больше, чем try/finally. Мне очень нравится концепция гарантированно выполняется в конце, просто не уверен во вложенности. Я до сих пор помню winapi кошмар, когда после каждого вызова функции вы проверяете возвращаемую переменную и восстанавливаете то, что уже было сделано, успешно выполненными функциями (своего рода откат). Много ВЛАЖНЫХ ifs ... - person Sinatr; 12.11.2014

Конечно, это является. Блок finally будет выполняться, если поток управления входит в соответствующий блок try.

Единственное исключение - это вызов, который выключает виртуальную машину.

person Bathsheba    schedule 12.11.2014
comment
У нас здесь нет JVM, только виртуальная машина :) - person HimBromBeere; 12.11.2014
comment
Публикуем совместно! - person Bathsheba; 12.11.2014
comment
По-прежнему нет System.exit :) - person decPL; 12.11.2014
comment
Иногда лучше меньше, да лучше. Признаюсь: я не программист на C # (никогда не понимал разницы между struct и class) и подумал, что это вопрос Java. Проверка правильности этого ответа на C # ... - person Bathsheba; 12.11.2014
comment
Ага, держится. И я не считаю, что стиль OP вызывает возражения, особенно если вы привязаны к функциям RAII других языков, таких как C ++. - person Bathsheba; 12.11.2014