Глобальный обработчик неперехваченных исключений

У меня есть программа с некоторыми DLL-расширениями, которые загружаются во время выполнения. Интерфейс - это CefSharp в WinForms. Но программа уже такая большая, использует некоторые другие части стороннего кода (о которых я не могу позаботиться), и эта программа должна работать без постоянного обслуживания в удаленном магазине, поэтому мне нужен глобальный обработчик исключений. для неперехваченных исключений, чтобы обрабатывать эти исключения и регистрировать их для анализа.

Я уже действительно искал решения и руководства, но ничего не помогло мне.

Основная форма просто запускает другую сборку (и дает ему объект формы), и эта сборка «делает свое дело». например добавьте в форму CefSharp-Browser.

Я попытался добавить метод обработки Handles Me.UnhandledException, MyBase.UnhandledException, MyClass.UnhandledException в ApplicationEvents.vb

Namespace My     

    Partial Friend Class MyApplication

        Protected Overrides Function OnInitialize(ByVal commandLineArgs As System.Collections.ObjectModel.ReadOnlyCollection(Of String)) As Boolean

            Me.MinimumSplashScreenDisplayTime = 0

            AddHandler My.Application.UnhandledException, AddressOf UnhandledExceptionHandler

            Return MyBase.OnInitialize(commandLineArgs)

        End Function


        Public Sub UnhandledExceptionHandler(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException, MyBase.UnhandledException, MyClass.UnhandledException

            Dim errstr = $"Message: {vbNewLine}
                      {e.Exception.Message}{vbNewLine}
                      {vbNewLine}
                      InnerMessage: {vbNewLine}
                      {e.Exception.InnerException.Message}{vbNewLine}
                      {vbNewLine}
                      Stacktrace: {vbNewLine}
                      {e.Exception.StackTrace.ToString()}{vbNewLine}"
            MsgBox($"Aa uncaught exception was thrwon! {vbNewLine} {vbNewLine} {errstr}")

        End Sub

    End Class

End Namespace

Но этот метод UnhandledExceptionHandler никогда не вызывается, даже если выбрасываются исключения, которые помечаются отладчиком как неперехваченные и вызывают приостановку отладки.

Итак, если мой вопрос был непонятен: может ли кто-нибудь помочь мне или объяснить мне, где я допустил ошибку, где я мог сделать неправильное предположение или как будет работать такой обработчик неперехваченных исключений.

в vb.net в Visual Studio 2017


person Horitsu    schedule 05.01.2018    source источник
comment
Запустите приложение напрямую, то есть не в отладчике, и посмотрите, что произойдет, когда исключение будет выброшено и не обнаружено где-либо еще.   -  person jmcilhinney    schedule 05.01.2018
comment
Программа не аварийно завершает работу, но также не дает мне информации о неперехваченном исключении (и да, оно есть, я позаботился об этом)   -  person Horitsu    schedule 05.01.2018
comment
Где именно выбрасывается исключение? Если он находится в обработчике событий Load формы, значит, вы его не видите. Такие исключения игнорируются в 64-битной системе. Если вы хотите узнать почему, вы можете поискать это.   -  person jmcilhinney    schedule 05.01.2018
comment
Дело в том, что исключение может быть вызвано везде в загруженных расширениях. Когда я знаю, где возникает исключение, я забочусь об этом в этом месте, чтобы добиться правильной обработки исключений. Но речь идет о неизвестных исключениях, например. исключения, вызванные сторонним кодом или поврежденной конфигурацией настроек и т. д.   -  person Horitsu    schedule 05.01.2018
comment
Но кое-что я увидел: исключение перехватывает отладчик. Вызываемая функция вызывается браузером CefSharp через Javascript. Но после продолжения в окне devTools браузера CefSharp отображается список ошибок ... после того, как отладчик уже уловил исключение. Мне не кажется логичным, что отладчик приостанавливает выполнение программы, в то время как исключение, похоже, перехватывается в Cef.   -  person Horitsu    schedule 05.01.2018
comment
Интересно, что я только что протестировал исключение в Load обработчике событий формы, и оно тоже сработало правильно, так что, возможно, Microsoft наконец-то решила эту вопиющую проблему. Итак, я вижу, что он работает так, как должен, если все сделано так, как я описал. Если вы говорите об исключении, сгенерированном браузером в коде JavaScript, то оно, конечно, не будет вызывать ваш UnhandledException обработчик событий, потому что здесь нет управляемого исключения. Если браузер не выдаст исключение в управляемом коде, вашему приложению нечего перехватить.   -  person jmcilhinney    schedule 05.01.2018
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Horitsu    schedule 05.01.2018
comment
Я отклоняю приглашение.   -  person jmcilhinney    schedule 05.01.2018
comment
Пример исключения вызван в моем коде vb.net, но функция вызывается функцией javascript в браузере CefSharp. И эта функция javascript не имеет обработки исключений. (И это также не было бы решением, которое я ищу, просто добавить его туда.) Я попытаюсь вызвать другое исключение, которое не является (более или менее вызываемым браузером CefSharp)   -  person Horitsu    schedule 05.01.2018
comment
Я специально вызвал исключение в собственном потоке (чтобы выйти из обычной цепочки вызовов), и без отладчика программа теперь просто вылетает. Метод перехвата неперехваченного исключения не был вызван. Так что я все еще занимаюсь начальной проблемой своего вопроса. У меня есть предчувствие, что я ошибаюсь в своем мышлении, но я также не знаю, что мне нужно искать. Я подумал: с помощью метода, который обрабатывает неперехваченные исключения в начальной сборке, который вызывает основное расширение, которое загружает и запускает все остальные, я могу перехватить все эти неизвестные исключения из всех остальных.   -  person Horitsu    schedule 05.01.2018
comment
Как я уже сказал, у меня это сработало, используя шаги, которые я указал в своем ответе ниже. Я предлагаю вам выполнить эти шаги и посмотреть, работают ли они для вас. Если они этого не делают, то с вашей средой что-то не так. Если они действительно работают, то с вашим проектом что-то не так. Это предложение Handles и выражение AddHandler предполагают, что вы сделали то, для чего нет веских причин.   -  person jmcilhinney    schedule 05.01.2018


Ответы (1)


Вот что я только что сделал, чтобы доказать, что он работает как надо:

  1. Создайте новый проект WinForms.
  2. Добавьте Button в форму и обработайте его Click событие.
  3. Добавьте код в обработчик событий, который вызовет исключение, например IO.File.OpenRead("this file does not exist").
  4. Откройте страницу «Приложение» в свойствах проекта и нажмите кнопку «Просмотр событий приложения».
  5. Выберите «(События MyApplication)» в среднем раскрывающемся списке вверху окна кода, а затем выберите UnhandledException в самом правом раскрывающемся списке.
  6. Добавьте код уведомления в обработчик событий, например MessageBox.Show(e.Exception.ToString()).
  7. Нажмите F5, чтобы запустить проект в отладчике, и щелкните Button. Обратите внимание, что отладчик уведомит вас об исключении.
  8. Нажмите Ctrl + F5, чтобы запустить приложение без отладки, и щелкните Button. Обратите внимание, что код вашего уведомления выполняется.
person jmcilhinney    schedule 05.01.2018