Почему Program.Main не отображается в стеке сбоев - PullRequest
0 голосов
/ 17 сентября 2011

все

Я пишу приложение на C #, которое обрабатывает все необработанные исключения в основной процедуре:

    static void Main()
    {
        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainFrame());                     
        }
        catch (Exception e)
        {
            CrashReporter.Report(e);
        }
    }

И когда я запускаю приложение (даже Release build) из visual studio, оно работает. Но когда я публикую его как щелчок один раз и установлю, в большинстве случаев исключения не будут зафиксированы в функции Main. А стек исключений выглядит примерно так:

...
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

т.е. Главное даже не в стеке ... Почему это происходит? Есть ли способ сделать такую ​​вещь «поймать все»? Почему поведение публикации и локальной сборки отличается?


Спасибо заранее Serge

Ответы [ 3 ]

2 голосов
/ 17 сентября 2011

Чтобы ответить на ваш Есть ли способ сделать такую ​​вещь "поймать все"? вопрос, проверьте AppDomain.UnhandledException

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

и Application.ThreadException события.

Это событие позволяет приложению Windows Forms обрабатывать необработанные исключения, возникающие в потоках Windows Forms. Присоедините ваши обработчики событий к событию ThreadException, чтобы обработать эти исключения, которые оставят ваше приложение в неизвестном состоянии. Где возможно, исключения должны обрабатываться структурированным блоком обработки исключений. ...

2 голосов
/ 17 сентября 2011

Я ожидаю, что исключение не было сгенерировано в главном потоке.

Очевидно, что другие потоки не имеют Main в стеке (потому что функция потока является их точкой входа).

Поскольку вы получаете обратный вызов «nativewindow», это означает, что собственное окно работает в другом потоке.Возможно, вы захотите использовать передачу сообщений или использовать Invoke для ретрансляции обратного вызова, если вам нужен код для работы в одном потоке.

0 голосов
/ 17 сентября 2011

Исключение выдается в обратном вызове окна; они вызываются в потоке событий. Трассировка стека, которую вы видите, это та, что из этого потока, а не основная, где запускается ваша программа.

...