Проблемы с обработкой исключений в приложении Winforms с использованием глобального обработчика ошибок - PullRequest
0 голосов
/ 09 сентября 2009

У меня есть приложение Windows Form, в котором есть глобальный обработчик ошибок для отображения непредвиденных ошибок.

Namespace My

    Class MyApplication

        Delegate Sub ProcessParametersDelegate(ByVal sender As Object, ByVal args() As String)

        Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException

            Dim ErrorText As String = e.Exception.Message & ", " & e.Exception.StackTrace

            Try                    
                MessageBox.Show("Global Error Handler: An unhandled error occurred. It will be copied to your clipboard upon OKing this message: " & ErrorText)
                Clipboard.SetText(ErrorText)
            Catch ex As Exception

            End Try

        End Sub

    End Class

End Namespace

В VS2008 мои параметры Debug -> Exceptions установлены на значения по умолчанию, которые должны вызывать ошибку для всех необработанных исключений.

У меня есть несколько вопросов:

1) для того же развернутого кода я ИНОГДА получаю номер строки в отображаемом сообщении об ошибке StackTrace, а иногда нет, даже когда сообщение об ошибке включает в себя исходный код, который я написал, а не ссылочный двоичный файл. Проект скомпилирован с конфигурацией DEBUG.

2) Приложение странным образом сворачивает в трей при возникновении ошибки (я думаю, вряд ли кто-нибудь сможет диагностировать эту проблему без моего дополнительного кода, опубликованного, но я все равно упомяну об этом)

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

Ответы [ 2 ]

2 голосов
/ 09 сентября 2009

1)

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

Вместо:

Dim ErrorText As String = e.Exception.Message & ", " & e.Exception.StackTrace

Использование:

Dim ErrorText As String = e.Exception.ToString()

Кроме того, убедитесь, что файл .pdb развернут в том же месте, что и файл .exe.

2) Не уверен.

3)

Чтобы пройти через MyApplication_UnhandledException в отладчике:

Отладка -> Запуск без отладки

Отладка -> Присоединить к процессу

Найдите имя вашего приложения в окне «Присоединить к процессу» и присоедините его. Ваша точка останова теперь будет достигнута.

Мне нравится использовать это, чтобы вызвать исключение, но есть много других вариантов:

MessageBox.Show(Nothing.ToString())
0 голосов
/ 09 сентября 2009

Относительно пункта 3:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...