Как использовать несколько обработчиков ошибок в VBA - PullRequest
0 голосов
/ 28 марта 2020

Я пытался использовать множественную обработку ошибок в коде VBA

Sub ErrorTestMultiple()

Test1:
    On Error GoTo ErrHandler1
        y = 6 / 0
        GoTo Test2

ErrHandler1:
        Cells(4, "H") = "Test 1 failed"
        Cells(4, "I") = Err.Description


Test2:

    On Error GoTo ErrHandler2
        y = 6 / 0 ' Process stop here - Why is the 2nd Error handler not working?
        GoTo Test3

ErrHandler2:
        Cells(5, "H") = "Test 2 failed"
        Cells(5, "I") = Err.Description

Test3:

End Sub

Я пытался добавить резюме в следующем примере в здесь , но это не сработало

Как я могу заставить это работать?

Ответы [ 4 ]

2 голосов
/ 28 марта 2020

Необходимо предварительно сбросить обработчик ошибок с помощью On Errro Goto -1, т. Е.

Sub ErrorTestMultiple()

Test1:
    On Error GoTo ErrHandler1
        y = 6 / 0
        GoTo Test2

ErrHandler1:
        Cells(4, "H") = "Test 1 failed"
        Cells(4, "I") = Err.Description


Test2:

    On Error GoTo -1
    On Error GoTo ErrHandler2

        y = 6 / 0 ' Process stop here - Why is the 2nd Error handler not working?
        GoTo Test3

ErrHandler2:
        Cells(5, "H") = "Test 2 failed"
        Cells(5, "I") = Err.Description

Test3:

End Sub

Но это не очень хорошая практика . Далее читаем здесь

PS Вы можете изменить структуру приведенного выше кода следующим образом

Sub ErrorTestMultiple()

    Dim y As Double

    On Error GoTo ErrorHandler

    y = 6 / 0
    y = 6 / 0

    Exit Sub

ErrorHandler:

    Dim j As Long
    j = j + 1

    Cells(3 + j, "H") = "Test " & j & " failed"
    Cells(3 + j, "I") = Err.Description

    Resume Next

End Sub
0 голосов
/ 28 марта 2020

Вы можете иметь несколько обработчиков ошибок в процедуре. Хитрость заключается в том, чтобы избежать распространенного примера Goto Label. Вместо этого вы должны использовать комбинацию On Error Resume Next и On Error Goto O, чтобы эмулировать блок try catch.

Sub ErrorTestMultiple()

    ' Test 1
    On Error Resume Next
    Y = 6 / 0
    If Err.Number <> 0 Then
        On Error GoTo 0
        Cells(4, "H") = "Test 1 failed"
        Cells(4, "I") = Err.Description
        Exit Sub

    End If
    On Error GoTo 0
    ' Test 2
    On Error Resume Next
    Y = 6 / 0 
    If Err.Number <> 0 Then
        On Error GoTo 0
        Cells(5, "H") = "Test 2 failed"
        Cells(5, "I") = Err.Description
        Exit Sub
    End If
    On Error GoTo 0

End Sub

Здесь вы найдете несколько хороших прочтений об альтернативных стратегиях Goto ErrorHandler

https://rubberduckvba.wordpress.com/2019/05/

0 голосов
/ 28 марта 2020

Как указано в Storax.

Для каждой подпрограммы применяется один обработчик ошибок. Таким образом, обработка ошибок будет применяться только на основе первого экземпляра вызова ошибки.

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

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

Правильное структурирование кода большую часть времени может сделать свое дело.

0 голосов
/ 28 марта 2020
Sub ErrorTestMultiple()

Test1:
    On Error GoTo ErrHandler1
        y = 6 / 0
    on error goto 0
        GoTo Test2

ErrHandler1:
        Cells(4, "H") = "Test 1 failed"
        Cells(4, "I") = Err.Description

         Resume next

Test2:

    On Error GoTo ErrHandler2
        y = 6 / 0
    on error goto 0
        GoTo Test3

ErrHandler2:
        Cells(5, "H") = "Test 2 failed"
        Cells(5, "I") = Err.Description

         Resume next
Test3:

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