Задать вопрос

Как закрыть консольное C# приложение, если выскочит необработанное исключение?

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

Чтобы закрывать консольное приложение, в начало мэйна вставил:
AppDomain.CurrentDomain.UnhandledException += (s, e) => 
    Process.GetCurrentProcess().Kill();


Почему-то не помогло. Для того, чтобы проверить эту строчку, создавал пустое приложение, добавлял туда этот код, после выбрасывал сам исключение - программа закрывалась. Моя же почему-то не закрывается. Само исключение выбрасывается при работе с библиотекой для распознавания Puma.NET. Не подскажите, как можно решить проблему: закрывать программу при выскакивании необработанного исключения?
  • Вопрос задан
  • 1224 просмотра
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@smozhaykin
Скорее всего дело в нативной библиотеке. Потестил:

#include <exception>

extern "C" {
    __declspec(dllexport) void CrashTest()
    {
        std::exception* ex = 0;
        ex->what();
    }
}


class Program
    {
        [DllImport("PInvokeCrashTest.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void CrashTest();

        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.UnhandledException += (s, e) =>
                {
                    Console.WriteLine(string.Format("EXCEPTION: {0}", e.ExceptionObject.ToString()));
                    Process.GetCurrentProcess().Kill();
                };

            CrashTest();
        }
    }


Получаю

Unhandled Exception: System.AccessViolationException: Attempted to read or write
protected memory. This is often an indication that other memory is corrupt.
at ExceptionTest.Program.CrashTest()
at ExceptionTest.Program.Main(String[] args) in d:\PInvokeCrashTest\Exception
Test\Program.cs:line 25


и application has stopped working окно.

Если добавить в конфиг файл
<runtime>
	<legacyCorruptedStateExceptionsPolicy enabled="true" />
</runtime>


то приложение завершается нормально:

EXCEPTION: System.AccessViolationException: Attempted to read or write protected
memory. This is often an indication that other memory is corrupt.
at ExceptionTest.Program.CrashTest()
at ExceptionTest.Program.Main(String[] args) in d:\PInvokeCrashTest\Exception
Test\Program.cs:line 24


Решение взято отсюда
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы