2013-03-02 2 views
3

AFAIK, try и finally блок используется выполнить фрагмент кода, который может бросить некоторые exception, мы также добавляем catch блок, если мы готовы обработать некоторый тип исключения и/или за исключением их, как FileIOException, AccessRight что ли. Но когда я управлял этим ..Ошибка в CLR? выполнение CLR двигатель не удалось

private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      Environment.FailFast("It failed"); 
     } 
     finally 
     { 
      MessageBox.Show("Done"); 
     } 
    } 

Своих перерывами с исключением и говорит

FatalExecutionEngineError был обнаружен
сообщения: среда обнаружена фатальная ошибка. Адрес ошибки был равен 0x032526f4, в потоке 0xd04. Код ошибки: 0x80131623. Эта ошибка может быть ошибкой в ​​CLR или в небезопасных или не поддающихся проверке частях кода пользователя. Общие источники этой ошибки включают ошибки маршалинга пользователя для COM-interop или PInvoke, которые могут повредить стек.

Теперь msdn говорит

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

Итак, я добавил блок catch, но все же он говорит то же самое.

private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      Environment.FailFast("It failed"); 
     } 
     catch (Exception ex) 
     { 

     } 
     finally 
     { 
      MessageBox.Show("Done"); 
     } 
    } 

Не удалось выполнить с той же ошибкой. Что касается CLR, который говорит, что блок кода в конечном итоге всегда запускается (по крайней мере, когда добавляется catch), это, безусловно, не так. Обзоры/мнения кого-нибудь?

Также здесь снимок ..

enter image description here

ответ

7

Это дизайн. Цель Environment.FailFast - немедленно прекратить выполнение. По дизайну он не будет запускать какой-либо код в catch или finally.

The documentation говорит:

Этот метод завершает процесс без использования каких-либо активных Try /, наконец, блоки или финализаторы.

Метод FailFast записывает строку сообщения в журнал событий приложений Windows , создает дамп вашего приложения, а затем завершает текущий процесс. Строка messa также включена в отчет об ошибках .

Используйте метод FailFast вместо метода Exit, чтобы прекратить ваше приложение, если состояние вашего приложения поврежден и не подлежит ремонту, и выполнение Try /, наконец, блоки вашего приложения и финализаторы испортит программные ресурсы.

Это дает понять, что код в ваших блоках finally не будет работать.Если бы был способ сделать запуск кода после Environment.FailFast, то это сделало бы Environment.FailFast практически бесполезным. Само его существование основано на том, что ваш код не выполняется после его вызова.

Вы указываете в документации, что государства (курсив мой):

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

Но эти слова просто не применяются здесь. Вы предполагаете, что при вызове Environment.FailFast необработанное исключение завершает работу приложения. Это не относится к делу. Приложение просто прекращено на месте - нет необработанного исключения.

Смежные вопросы