Перехват ThreadingException в VB.NET, когда Sub Main недоступен - PullRequest
4 голосов
/ 14 марта 2011

У меня есть решение Winforms VB.NET, и я хотел бы добавить стандартные обработчики исключений приложений - Application.ThreadException и AppDomain.CurrentDomain.UnhandledException.

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

' Starts the application. '
<SecurityPermission(SecurityAction.Demand, Flags:=SecurityPermissionFlag.ControlAppDomain)> _
Public Shared Sub Main()
    ' Add the event handler for handling UI thread exceptions to the event. '
    AddHandler Application.ThreadException, AddressOf ErrorHandlerForm.Form1_UIThreadException

    ' Set the unhandled exception mode to force all Windows Forms errors to go through'
    ' our handler. '
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)

    ' Add the event handler for handling non-UI thread exceptions to the event. '
    AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException

    ' Runs the application. '
    Application.Run(New ErrorHandlerForm())
End Sub

Как я могу сделать это в VB.NET, когда у меня нет доступа к Sub Main() методу?

Это тот случай, когда включена опция «Включить Application Framework» свойств моего решения (Sub Main скрыто) ...

Ответы [ 2 ]

1 голос
/ 14 марта 2011

Я вижу вашу проблему, я думаю - кажется, вам не хватает оператора Imports в начале вашего файла кода. Вы можете добавить необходимые Import или полностью указать типы, к которым вы обращаетесь:

Imports System
Imports System.Windows.Forms

Public Shared Sub MyApplicationInitialization()
    AddHandler System.Windows.Forms.Application.ThreadException, AddressOf MyThreadExceptionHandler

    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)

    AddHandler System.AppDomain.CurrentDomain.UnhandledException, AddressOf MyUnhandledExceptionHandler
End Sub

Как вы можете видеть из этого, AppDomain живет в пространстве имен System и Application в пространстве имен System.Windows.Forms.

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

Sub MyUnhandledExceptionHandler(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
    'your logic here
End Sub

Sub MyThreadExceptionHandler(ByVal sender As Object, ByVal e As ThreadExceptionEventArgs)
    'your logic here
End Sub
1 голос
/ 14 марта 2011

Вы можете перехватить событие My.Application.Startup , чтобы добавить код, который необходимо выполнить перед загрузкой любых форм.

Обратите внимание, что код для обработчика события Startup хранится в файле ApplicationEvents.vb, который по умолчанию скрыт.

РЕДАКТИРОВАТЬ: Чтобы ответить на ваш комментарий, существует путаница между My.Application и System.Windows.Forms.Application. Если вы префикс .Application с System.Windows.Forms, он будет работать - я только что проверил это.

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