Как запретить выполнение finally
От: -rsdn- Беларусь http://dsalodki.wix.com/resume
Дата: 12.06.15 06:54
Оценка: :)
Re: Как запретить выполнение finally
От: -rsdn- Беларусь http://dsalodki.wix.com/resume
Дата: 12.06.15 08:07
Оценка:
Здравствуйте, -rsdn-, Вы писали:

единственное что нашел
StackOverflowException
ExecutingEngineException
при их срабатывании finally не перехватит исключение
Re: Но зачем? (-)
От: 0x7be СССР  
Дата: 12.06.15 08:19
Оценка:
Re[2]: Но зачем? (-)
От: Sinix  
Дата: 12.06.15 08:23
Оценка: +1 :)
Здравствуйте, 0x7be, Вы писали:

>Но зачем?

http://rsdn.ru/forum/dotnet/6075456.1
Автор: Sinix
Дата: 11.06.15
Re[2]: Как запретить выполнение finally
От: fatkh  
Дата: 12.06.15 08:25
Оценка:
Здравствуйте, -rsdn-, Вы писали:

R>единственное что нашел

R>StackOverflowException
R>ExecutingEngineException
R>при их срабатывании finally не перехватит исключение

Если убить процесс вовремя, finally не отработает, естественно.
    try {
        Console.WriteLine("try");
        Environment.FailFast("reason");
    } catch {
        Console.WriteLine("catch");
    } finally {
        Console.WriteLine("finally");
    }
Re[2]: Но зачем? (-)
От: andy1618 Россия  
Дата: 12.06.15 10:50
Оценка: +3
Здравствуйте, 0x7be, Вы писали:

>Но зачем? (-)


Да, в исходной постановке вопрос странный.
А вот если его перефразировать на "В каких случаях блок finally не исполнится" — вот это уже гораздо интереснее и практичнее.

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

А ответ был простым и неубиваемым: "Блок finally не исполнится, к примеру, если мы вытащим вилку питания сервера из розетки"
Re[3]: Но зачем? (-)
От: Слава  
Дата: 13.06.15 09:36
Оценка:
Здравствуйте, andy1618, Вы писали:

A>А ответ был простым и неубиваемым: "Блок finally не исполнится, к примеру, если мы вытащим вилку питания сервера из розетки"


Блок finally может не исполниться в .net 3.5 и младших версиях, при некоторых исключительных обстоятельствах. Была статья про это.
Re: Как запретить выполнение finally
От: hardcase Пират http://nemerle.org
Дата: 13.06.15 09:57
Оценка:
Здравствуйте, -rsdn-, Вы писали:

Использовать конструкцию MSIL try-fault.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Но зачем? (-)
От: andy1618 Россия  
Дата: 13.06.15 11:16
Оценка:
Здравствуйте, Слава, Вы писали:

A>>А ответ был простым и неубиваемым: "Блок finally не исполнится, к примеру, если мы вытащим вилку питания сервера из розетки"


С>Блок finally может не исполниться в .net 3.5 и младших версиях, при некоторых исключительных обстоятельствах. Была статья про это.


Ну да, в той байке, помнится, кандидат начал ответ именно с этих примеров (stack overflow exception, FailFast),
но собеседователи отмахивались, что, мол, "вы неправы, читайте документацию". Вот тогда-то он и привёл пример со шнуром питания
Re[2]: Как запретить выполнение finally
От: Sinix  
Дата: 13.06.15 12:24
Оценка: +2 :))) :)
Здравствуйте, hardcase, Вы писали:

Как запретить выполнение finally

H>Использовать конструкцию MSIL try-fault.

А просто не использовать finally — слишком просто?
Re: Как запретить выполнение finally
От: Pavel Dvorkin Россия  
Дата: 14.06.15 13:18
Оценка:
Здравствуйте, -rsdn-, Вы писали:

А вот так не годится ?


bool doFinally = true;

try {
//...
if(something) doFinally = false;
}
finally {
if(doFinally) {
// finally code
}
}


Или есть разница между "запрещен" и "ничего не делает" ?
With best regards
Pavel Dvorkin
Re[2]: Как запретить выполнение finally
От: -rsdn- Беларусь http://dsalodki.wix.com/resume
Дата: 14.06.15 16:26
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, -rsdn-, Вы писали:


PD>А вот так не годится ?


PD>

PD>bool doFinally = true;

PD>try {
PD>//...
PD>if(something) doFinally = false;
PD>}
PD>finally {
PD>if(doFinally) {
PD>// finally code
PD>}
PD>}
PD>


PD>Или есть разница между "запрещен" и "ничего не делает" ?


нет, среди списка прочих вопросов такое решение было бы ниже плинтуса
Re: Как запретить выполнение finally
От: Qulac Россия  
Дата: 14.06.15 16:39
Оценка:
Здравствуйте, -rsdn-, Вы писали:

Выбросить ексепшен в блоке catсh:
         try
            {
                throw new Exception("I error 1!");
            }
            catch (Exception e)
            {
                throw new Exception("I error 2!");
            }
            finally
            {
                Console.Write("I finally!");
            }


Выводит: "Не обработанное исключение: System.Exception:"I error 2!"
Программа – это мысли спрессованные в код
Отредактировано 14.06.2015 16:42 Qulac . Предыдущая версия .
Re[2]: Как запретить выполнение finally
От: fddima  
Дата: 14.06.15 17:29
Оценка:
Здравствуйте, Qulac, Вы писали:

Q>Выбросить ексепшен в блоке catсh:

В общем случае — мы завернуты в try/catch.

static void Main(string[] args)
{
    try
    {
        try
        {
            throw new Exception("I error 1!");
        }
        catch (Exception e)
        {
            throw new Exception("I error 2!");
        }
        finally
        {
            Console.Write("I finally!");
        }
    }
    catch (Exception e)
    {
        throw;
    }
}


Выводит:
I finally!
Unhandled Exception: System.Exception: I error 2!
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[3]: Как запретить выполнение finally
От: Pavel Dvorkin Россия  
Дата: 15.06.15 02:29
Оценка:
Здравствуйте, -rsdn-, Вы писали:


PD>>Или есть разница между "запрещен" и "ничего не делает" ?


R>нет, среди списка прочих вопросов такое решение было бы ниже плинтуса


Ну если на собеседовании, то, может, и да. А если по существу — почему ?
With best regards
Pavel Dvorkin
Re[4]: Как запретить выполнение finally
От: Sinix  
Дата: 15.06.15 06:56
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

R>>нет, среди списка прочих вопросов такое решение было бы ниже плинтуса

PD>Ну если на собеседовании, то, может, и да. А если по существу — почему ?

Уже спрашивал, http://rsdn.ru/forum/dotnet/6075456.1
Автор: Sinix
Дата: 11.06.15



Странные вопросы какие-то. Одновременно и непростые, и бесполезные на практике. Это как спрашивать на собеседовании про "пробивать доску пальцем". Оно конечно ого, но я лучше дрель возьму.
Re: Как запретить выполнение finally
От: Vladek Россия Github
Дата: 15.06.15 14:22
Оценка:
С помощью булевой переменной.

var justDoIt = true;
try
{
    justDoIt = false;
}
finally
{
    if (justDoIt)
    {
        // finally block
    }
    // Look, mom, no finally! 
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.