Ошибка обработки возврата функции в VBA - PullRequest
2 голосов
/ 01 октября 2019

Я немного борюсь с обработкой ошибок возвращаемой функции в VBA.

Я получил некоторый код в подпрограмме, которая вызывает функцию. Функция возвращает 0 в случае успеха и -1 в случае ошибки.

Это мой саб:

Sub mySub

    Dim returnValue as Integer

    returnValue = functionA(...)

    If returnValue = -1 Then
        MsgBox "The following error appeared: " & err.description & ", Errornumber= " & err.number
    Else
        MsgBox "Success"
    End If

End Sub

Моя функция выглядит так:

Function functionA(...) as Integer

    On error goto errorHandler
    ' do something

    funtionA = 0

    Exit Function

    errorHandler:
        functionA = -1 

End Function

Теперь моя проблема: если функция возвращает -1, потому что она была остановленаошибка, я не могу получить какую-либо информацию от объекта ошибки в моей вызывающей подпрограмме. Код ошибки - 0, а описание - emtpy. Похоже, что конец функции сбрасывает объект err. Есть ли умный способ достичь того, что я хочу сделать?

Заранее спасибо! :)

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Один из подходов - вернуть номер ошибки вместо -1, а затем использовать его для получения информации об ошибке

Sub mySub

    Dim returnValue as Integer

    returnValue = functionA(...)

    if returnValue <> 0 Then
        On Error Resume Next
        Err.Raise returnValue 'raise the same error that appeared in functionA to get its details
        MsgBox "The following error appeared: " & Err.Description & ", Errornumber= " & Err.Number
        On Error GoTo 0
    Else
        MsgBox "Success"
    End If

End Sub

Function functionA(...) as Integer

    On error goto errorHandler
    ' do something

    funtionA = 0

    Exit Function

    errorHandler:
        functionA = Err.Number

End Function

Более короткий и приятный способ - выполнить всю обработку ошибок в вызывающей процедуре. ,Например:

Sub mySub()
    Dim returnValue as Integer 
    On Error Resume Next
    returnValue = functionA(...) 
    If Err.Number <> 0 Then 
        MsgBox "The following error appeared: " & err.description & ", Errornumber= " & err.number 
    Else 
        MsgBox "Success" 
    End If 
End Sub

Функция становится

Function functionA(...) as Integer

    ' do something

End Function
0 голосов
/ 01 октября 2019

Гораздо лучший способ справиться с ошибками - эмулировать конструкцию try / catch, найденную в других языках. Способ VBA для этого описан в статье RubberDuck «Pattern: TryParse»

https://rubberduckvba.wordpress.com/2019/05/09/pattern-tryparse/

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