Udostępnij za pośrednictwem


On Error — Instrukcja (Visual Basic)

Włącza procedurę obsługi błędów i określa lokalizację procedury w ramach procedury; można również użyć do wyłączenia procedury obsługi błędów. Instrukcja On Error jest używana w obsłudze błędów bez struktury i może być używana zamiast obsługi wyjątków strukturalnych. Obsługa wyjątków strukturalnych jest wbudowana w platformę .NET, jest ogólnie wydajniejsza i dlatego zaleca się obsługę błędów środowiska uruchomieniowego w aplikacji.

Bez obsługi błędów lub obsługi wyjątków każdy błąd czasu wykonywania, który występuje, jest krytyczny: jest wyświetlany komunikat o błędzie i zatrzymuje wykonywanie.

Uwaga

Słowo Error kluczowe jest również używane w instrukcji error, która jest obsługiwana w celu zapewnienia zgodności z poprzednimi wersjami.

Składnia

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

generatora

Termin Definicja
GoTolinia Włącza procedurę obsługi błędów, która rozpoczyna się od wiersza określonego w wymaganym argumencie wiersza . Argument wiersza to dowolna etykieta wiersza lub numer wiersza. Jeśli wystąpi błąd czasu wykonywania, kontrolka gałęzi do określonego wiersza, co sprawia, że procedura obsługi błędów jest aktywna. Określony wiersz musi znajdować się w tej samej procedurze co On Error instrukcja lub wystąpi błąd czasu kompilacji.
GoTo 0 Wyłącza procedurę obsługi błędów z włączoną obsługą w bieżącej procedurze i resetuje ją do elementu Nothing.
GoTo -1 Wyłącza włączony wyjątek w bieżącej procedurze i resetuje go do Nothing.
Resume Next Określa, że po wystąpieniu błędu w czasie wykonywania kontrolka przechodzi do instrukcji bezpośrednio po instrukcji, w której wystąpił błąd, a wykonanie jest kontynuowane od tego momentu. Użyj tego formularza, a nie On Error GoTo podczas uzyskiwania dostępu do obiektów.

Uwagi

Uwaga

Zalecamy używanie obsługi wyjątków strukturalnych w kodzie zawsze, gdy jest to możliwe, zamiast używania obsługi wyjątków bez struktury i instrukcji On Error . Aby uzyskać więcej informacji, zobacz Try... Łapać... Finally, instrukcja.

Procedura obsługi błędów "włączona" jest taka, która jest włączona przez instrukcję On Error . Procedura obsługi błędów "aktywna" jest włączoną procedurą obsługi, która jest w trakcie obsługi błędu.

Jeśli wystąpi błąd, gdy program obsługi błędów jest aktywny (między wystąpieniem błędu a instrukcją Resume, Exit Sub, Exit Functionlub Exit Property ), procedura obsługi błędów bieżącej procedury nie może obsłużyć błędu. Kontrolka powraca do procedury wywołującej.

Jeśli procedura wywołująca ma włączoną procedurę obsługi błędów, jest aktywowana w celu obsługi błędu. Jeśli procedura obsługi błędów wywołania jest również aktywna, kontrolka przechodzi z powrotem przez poprzednie procedury wywołujące, dopóki nie zostanie włączona, ale nieaktywna, zostanie znaleziona procedura obsługi błędów. Jeśli nie zostanie znaleziona taka procedura obsługi błędów, błąd jest krytyczny w momencie, w którym rzeczywiście wystąpił.

Za każdym razem, gdy program obsługi błędów przekazuje kontrolę z powrotem do procedury wywołującej, ta procedura staje się bieżącą procedurą. Po obsłużeniu błędu przez program obsługi błędów w dowolnej procedurze wykonywanie zostanie wznowione w bieżącej procedurze w punkcie wyznaczonym przez instrukcję Resume .

Uwaga

Procedura obsługi błędów nie jest procedurą Sub ani procedurą Function . Jest to sekcja kodu oznaczona etykietą wiersza lub numerem wiersza.

Właściwość Number

Procedury obsługi błędów polegają na wartości we Number właściwości Err obiektu, aby określić przyczynę błędu. Procedura powinna testować lub zapisywać odpowiednie wartości właściwości w Err obiekcie przed wystąpieniem jakiegokolwiek innego błędu lub przed wywołaną procedurą, która może spowodować wystąpienie błędu. Wartości właściwości w Err obiekcie odzwierciedlają tylko najnowszy błąd. Komunikat o błędzie skojarzony z elementem Err.Number jest zawarty w pliku Err.Description.

Throw — Instrukcja

Błąd zgłaszany przy Err.Raise użyciu metody ustawia Exception właściwość na nowo utworzone wystąpienie Exception klasy. W celu obsługi generowania wyjątków typów wyjątków Throw pochodnych instrukcja jest obsługiwana w języku. Przyjmuje to jeden parametr, który jest wystąpieniem wyjątku, które ma zostać zgłoszony. W poniższym przykładzie pokazano, jak te funkcje mogą być używane z obsługą istniejących wyjątków:

    On Error GoTo Handler
    Throw New DivideByZeroException()
Handler:
    If (TypeOf Err.GetException() Is DivideByZeroException) Then
    ' Code for handling the error is entered here.
    End If

Zwróć uwagę, że instrukcja przechwytuje On Error GoTo wszystkie błędy, niezależnie od klasy wyjątków.

Przy wznawianie błędu w następnej kolejności

On Error Resume Next powoduje kontynuowanie wykonywania instrukcji bezpośrednio po instrukcji, która spowodowała błąd czasu wykonywania, lub z instrukcją bezpośrednio po ostatnim wywołaniu procedury zawierającej instrukcję On Error Resume Next . Ta instrukcja umożliwia kontynuowanie wykonywania pomimo błędu czasu wykonywania. Możesz umieścić procedurę obsługi błędów, w której wystąpi błąd, zamiast przenosić kontrolkę do innej lokalizacji w ramach procedury. Instrukcja On Error Resume Next staje się nieaktywna, gdy wywoływana jest inna procedura, dlatego należy wykonać instrukcję On Error Resume Next w każdej wywoływanej procedurze, jeśli potrzebujesz wbudowanej obsługi błędów w ramach tej procedury.

Uwaga

Konstrukcja On Error Resume Next może być preferowana On Error GoTo w przypadku obsługi błędów generowanych podczas uzyskiwania dostępu do innych obiektów. Sprawdzanie Err po każdej interakcji z obiektem powoduje usunięcie niejednoznaczności co do tego, do którego obiektu uzyskiwano dostęp za pomocą kodu. Możesz mieć pewność, który obiekt umieścił kod błędu w Err.Numberobiekcie , a także, który obiekt pierwotnie wygenerował błąd (obiekt określony w Err.Sourcepliku ).

W przypadku błędu GoTo 0

On Error GoTo 0 Wyłącza obsługę błędów w bieżącej procedurze. Nie określa wiersza 0 jako początku kodu obsługi błędów, nawet jeśli procedura zawiera wiersz numerowany 0. On Error GoTo 0 Bez instrukcji program obsługi błędów jest automatycznie wyłączany po zakończeniu procedury.

Na błędzie GoTo -1

On Error GoTo -1 wyłącza wyjątek w bieżącej procedurze. Nie określa wiersza -1 jako początku kodu obsługi błędów, nawet jeśli procedura zawiera wiersz numerowany -1. On Error GoTo -1 Bez instrukcji wyjątek jest automatycznie wyłączany po zakończeniu procedury.

Aby zapobiec uruchamianiu kodu obsługi błędów, gdy nie wystąpił błąd, umieść instrukcję Exit Sub, Exit Functionlub Exit Property bezpośrednio przed procedurą obsługi błędów, jak w poniższym fragmentcie:

Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)
   On Error GoTo ErrorHandler
   ' Insert code that might generate an error here
   Exit Sub
ErrorHandler:
   ' Insert code to handle the error here
   Resume Next
End Sub

W tym miejscu kod obsługi błędów jest zgodny z instrukcją Exit Sub i poprzedza instrukcję End Sub , aby oddzielić ją od przepływu procedury. Kod obsługi błędów można umieścić w dowolnym miejscu w procedurze.

Niezaznaczone błędy

Niezatrażone błędy w obiektach są zwracane do aplikacji kontrolującej, gdy obiekt jest uruchomiony jako plik wykonywalny. W środowisku programistycznym błędy niezatrażone są zwracane do aplikacji kontrolującej tylko wtedy, gdy są ustawione odpowiednie opcje. Zapoznaj się z dokumentacją aplikacji hosta, aby zapoznać się z opisem opcji, które należy ustawić podczas debugowania, jak je ustawić i czy host może tworzyć klasy.

Jeśli utworzysz obiekt, który uzyskuje dostęp do innych obiektów, spróbuj obsłużyć wszelkie nieobsługiwane błędy, które przechodzą z powrotem. Jeśli nie możesz, zamapuj kody błędów na Err.Number jeden z własnych błędów, a następnie przekaż je z powrotem do obiektu wywołującego. Należy określić błąd, dodając kod błędu do stałej VbObjectError . Jeśli na przykład kod błędu to 1052, przypisz go w następujący sposób:

Err.Number = vbObjectError + 1052

Uwaga

Błędy systemowe podczas wywołań bibliotek dynamicznych linków systemu Windows (DLL) nie zgłaszają wyjątków i nie mogą być uwięzione za pomocą pułapki błędów języka Visual Basic. Podczas wywoływania funkcji DLL należy sprawdzić każdą wartość zwracaną dla powodzenia lub niepowodzenia (zgodnie ze specyfikacjami interfejsu API), a w przypadku awarii sprawdź wartość we Err właściwości obiektu LastDLLError .

Przykład

W tym przykładzie najpierw użyto instrukcji On Error GoTo , aby określić lokalizację procedury obsługi błędów w ramach procedury. W tym przykładzie próba podzielenia przez zero powoduje wygenerowanie błędu o numerze 6. Błąd jest obsługiwany w procedurze obsługi błędów, a kontrolka jest następnie zwracana do instrukcji, która spowodowała błąd. Instrukcja On Error GoTo 0 wyłącza podlewki błędów. Następnie instrukcja On Error Resume Next jest używana do odroczenia podlewek błędów, aby kontekst błędu wygenerowanego przez następną instrukcję mógł być znany z niektórych. Należy pamiętać, że Err.Clear służy do czyszczenia Err właściwości obiektu po obsłużeniu błędu.

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x As Integer = 32
   Dim y As Integer = 0
   Dim z As Integer
   z = x / y   ' Creates a divide by zero error
   On Error GoTo 0   ' Turn off error trapping.
   On Error Resume Next   ' Defer error trapping.
   z = x / y   ' Creates a divide by zero error again
   If Err.Number = 6 Then
      ' Tell user what happened. Then clear the Err object.
      Dim Msg As String
      Msg = "There was an error attempting to divide by zero!"
      MsgBox(Msg, , "Divide by zero error")
      Err.Clear() ' Clear Err object fields.
   End If
Exit Sub      ' Exit to avoid handler.
ErrorHandler:  ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 6   ' Divide by zero error
         MsgBox("You attempted to divide by zero!")
         ' Insert code to handle this error
      Case Else
         ' Insert code to handle other situations here...
   End Select
   Resume Next  ' Resume execution at the statement immediately 
                ' following the statement where the error occurred.
End Sub

Wymagania

Przestrzeń nazw: Microsoft.VisualBasic

Zestaw: Biblioteka środowiska uruchomieniowego Visual Basic (w Microsoft.VisualBasic.dll)

Zobacz też