2015-05-27 25 views
5

Witam Mam ten projekt, w którym występują pewne problemy z tym, co ma być moim kodem dla obsługi "problemu".Obsługa wyjątków globalnych w VB

Public Event UnhandledException As UnhandledExceptionEventHandler 

Private Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
      Dim currentDomain As AppDomain = AppDomain.CurrentDomain 

      AddHandler currentDomain.UnhandledException, AddressOf MyHandler 
     End Sub 

    Sub MyHandler(ByVal sender As Object, ByVal args As UnhandledExceptionEventArgs) 
      Dim e As Exception = DirectCast(args.ExceptionObject, Exception) 

      Using sw As New StreamWriter(File.Open(myFilePath, FileMode.Append)) 
       sw.WriteLine(Date.now & e.toString) 
      End Using 

      MessageBox.Show("An unexcpected error occured. Application will be terminated.") 
      Application.Exit() 
     End Sub 

     Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click 
      Throw New Exception("Dummy Error") 
     End Sub 

Próbuję globalnie złapać wszystkie wyjątki i utworzyć plik dziennika podczas wykonywania, który działa dobrze w debugger (obsługa wyjątków i pisanie plik.txt), ale nie może złapać wszystkie nieobsługiwane wyjątki po tym, jak go zbudować w projekcie instalacji i Zainstalowany w maszynie. czego mi brakuje? Czy muszę dołączyć dodatkowe komponenty do mojego projektu instalacji? Pomoc byłaby bardzo ceniona

+0

Czy obsługa przebiega w ogóle - tj. jeśli przeniesiesz 'MessageBox' jako pierwszą linię w obsadzie, czy widzisz to? Możliwe, że otrzymujesz błąd w programie obsługi (na przykład wokół rejestrowania?) – theduck

+0

Próbowałem przenieść MessageBox do pierwszej linii programu obsługi i tak, to pokazuje. Próbowałem umieścić punkt przerwania na początku programu obsługi i wkroczyłem i przepłynąłem bezpośrednio przez program obsługi. – Adrian

+0

Czy uprawnienia do pliku dziennika są prawidłowe dla użytkownika, który uruchamia aplikację? – theduck

Odpowiedz

7

Istnieje już sposób na obsługę wyjątków dla całej aplikacji. Osadzenie tresera w formularzu oznacza, że ​​zostaną złapani i zalogowani tylko wtedy, gdy ta forma jest otwarta.

  1. Idź do Project -> Właściwości -> Application i kliknij przycisk "Zobacz Zastosowanie Zdarzenia" w/w pobliżu dna.

  2. To otworzy się ApplicationEvents.vb.

  3. Wybierz (MyApplicationEvents) w lewym menu; i UnhandledException w prawo. To otwiera inaczej typową procedurę obsługi zdarzenia, do którego można dodać kod:

    Private Sub MyApplication_UnhandledException(sender As Object, 
                  e As ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException 
    
        Dim myFilePath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), 
                  "badjuju.log") 
    
        Using sw As New StreamWriter(File.Open(myFilePath, FileMode.Append)) 
         sw.WriteLine(DateTime.Now) 
         sw.WriteLine(e.Exception.Message) 
        End Using 
    
        MessageBox.Show("An unexcpected error occured. Application will be terminated.") 
        End 
    
    End Sub 
    

to nie złapie wyjątki podczas IDE działa bo VS łapie je najpierw, dzięki czemu można je zobaczyć i je naprawić.