Обработка ошибок между процедурами более высокого и более низкого уровня - PullRequest
0 голосов
/ 20 октября 2019

У меня проблема с UDF нижнего уровня, который выдает ошибку до обработки ошибок подпрограммы самого высокого уровня. Я думал, что смогу исправить это с помощью On Error GoTo -1, но проблема все еще возникает.

Согласно Microsoft, «без оператора On Error GoTo -1 исключение автоматически отключается при выходе из процедуры» (https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/on-error-statement). Означает ли это, что когда я вызываю подпрограмму более низкого уровня, я "завершаю" процедуру и аннулирую оператор On Error GoTo -1?

Например, это для подпрограммы, которая принимает документ Excelи объединяет его с изображениями JPG в PDF. Изображения JPG должны быть упорядочены по номеру, который заканчивается именем их файла (то есть Photomics0). Иногда имя файла не будет иметь номер в конце имени файла. Я хочу эточтобы вызвать нормальную ошибку, которая должна произойти.

Подпрограмма самого высокого уровня имеет следующую обработку ошибок:

Sub Example()

Do While t = 1

On Error GoTo errorMSG1
Set wb2 = Workbooks(Copyrange)
On Error GoTo -1
'
' more code here & call to other subroutines
'
Exit Sub

Loop

errorMSG1:
    On Error GoTo -1
'
' Code that notifies user that they don't have the excel document open in 
' background and opens it for them
'
End Sub

UDF самого низкого уровня (3 уровня вниз) приводит к ошибке с кодом:

retvalint = CLng(retval)

из-за того, что retval должно быть числом в конце имени файла jpg. Без номера retval пусто и броситьs ошибка, из-за которой код переходит на errorMSG1, чего я не хочу.

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

Я пытался бросить On Error GoTo -1 абсолютно везде на всех уровнях моих подпрограмм и функций, но безрезультатно.

Кроме того, стоит отметить, что это пример того, как ошибки «всплывают»?

РЕДАКТИРОВАТЬ: я должен также сказать, что ранее я пытался использовать On Error GoTo 0, но более высокий уровеньсаб имеет большое Do Loop в нем. Я заметил, что, когда исходная ошибка, которую я пытался уловить, возникла на итерации> = 2, она выдала бы исходную ошибку Runtime Error.

1 Ответ

0 голосов
/ 20 октября 2019

Я не понимаю документации для этого, но я понял это из тестирования.

On Error GoTo 0 прекращает использовать текущий обработчик ошибок. On Error GoTo -1 очищает текущую ошибку.

Вот пример этого:

Sub OnErrorTest()
    On Error GoTo myErrHnd
        Err.Raise 42
        myErrorSub
    On Error GoTo 0
        Err.Raise 44
    Exit Sub

myErrHnd:
    Debug.Print ("Error: " & Err.Number)
    Debug.Print ("Description: " & Err.Description & vbNewLine)
    Resume Next
End Sub

Sub myErrorSub()
    On Error GoTo myOtherErrHnd
    Workbooks("").Close
    Exit Sub

myOtherErrHnd:
    On Error GoTo -1 ' aka Err.Clear
End Sub

Таким образом, чтобы исправить возникшую проблему, похоже, что вам нужно переключиться на On Error GoTo 0 после установки рабочей книги. Обычно ошибки всплывают, если в какой-либо из их родительских функций установлен обработчик ошибок.

...