Почему окончательно не выполняется в этой ситуации? - PullRequest
2 голосов
/ 09 июля 2011

У меня есть следующий код:

class SampleClass : IDisposable
{

    public void Dispose()
    {
        Console.WriteLine("Execute Dispose!");
    }
}

static void Main(string[] args)
{
    SampleClass sc = new SampleClass();

    try
    {
        throw new Exception();
    }
    finally
    {
        sc.Dispose();
    }
}

Однако, когда я запускаю это, он не печатает сообщение Execute Dispose!, почему это так?

ОБНОВЛЕНИЕ:

Если я изменил код следующим образом:

static void Main(string[] args)
{
    SampleClass sc = new SampleClass();

    try
    {
        try
        {
            throw new Exception();
        }
        finally
        {
            sc.Dispose();
        }
    }
    catch
    {
        throw;
    }
}

Сначала он печатает сообщение, а затем вылетает.

Я думаю о том, что есливначале вылетает приложение, можно ли его утилизировать так, как вам нравится?

Я знаю, что это просто, но я действительно хочу узнать больше.

Ответы [ 5 ]

11 голосов
/ 09 июля 2011

У вас есть необработанное исключение. Поведение программы зависит от реализации, когда у вас есть необработанное исключение .

Как вы обнаружили, в вашей конкретной реализации необработанное исключение first спросит вас, хотите ли вы отладить необработанное исключение (или распечатывает исключение на консоли), и затем запускает блок finally.

Обратите внимание, что не гарантируется, что блок finally выполняется, когда существует исключение необработанное .Реализация может немедленно завершить процесс при необработанном исключении, если сочтет это целесообразным.

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

10 голосов
/ 09 июля 2011

Он печатает Execute Dispose! в окне. Вы должны присмотреться.

5 голосов
/ 09 июля 2011

Это выполняется в моем тесте (LinqPad).

Как обычное консольное приложение, сообщение приходит после сообщения об исключении.

Необработанное исключение: System.Exception: Exception ofТип «System.Exception» был брошен.в OutputTest.Program.Main (String [] args) в D: ... \ Program .cs: строка 27 Выполнить Уничтожить! Нажмите любую клавишу для продолжения .,.

Но он показывает только после того, как вы закрыли "Окно приложения перестало работать"

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

Это печатается.Возможно, исключение, говорящее «Приложение перестало работать», мешает вам увидеть его.Нажмите «Отмена» и увидите напечатанное сообщение.

Снимок экрана:

enter image description here

0 голосов
/ 09 июля 2011

Как уже говорили другие, код работает. Возможно, вы захотите использовать конструктор using (вы можете использовать его, если класс реализует IDisposable)

class SampleClass : IDisposable {
    public void Dispose() {
        Console.WriteLine("Execute Dispose!");
    }
}

static void Main(string[] args) { 
    using (SampleClass sc = new SampleClass()) {
        throw new Exception();
    }
}
...