2013-04-04 3 views
4

У меня есть код VBA, который должен быть вложенной проверкой ошибок, но это не так. Код psuedo, как показано ниже. Однако, всякий раз, когда возникает ошибка в ошибке (например, в цикле сработала ошибка, goto SmallError возникает, и в SmallError возникает ошибка) Второй GoTo не используется. Затем ошибка прерывает код.VBA Вложенная ошибка Ошибка GoTo

Ex:

Ошибка Loop

GoTo SmallError

Ошибка в SmallError

Код Breaks (Здесь код должен GoTo FatalError)

Sub DoThings() 
    On Error GoTo SmallError 
    'Coding Happens 
    Do While(conditionhere) 
     'Looping things happen 
    GoTo LoopResume 
SmallError: 
    source = Err.source 
    descript = Err.Description 
    On Error GoTo Fatal Error 
    'Small error processing happens 
    Resume LoopResume 
FatalError: 
    source = Err.source 
    descript = Err. Description 
    On Error GoTo ExitError 
    'Fatal Error processing happens 
ExitError: 
    Exit Sub 
LoopResume: 
count = count + 1 
Loop 

On Error GoTo FatalError 
'Finishing code happens 
End Sub 

ответ

4

Вы не можете использовать оператор Error On внутри обработчика ошибок. См. это article that explains this.

Однако вы можете использовать отдельную процедуру, которая обрабатывает «правильную ошибку». Эта процедура может иметь обработчик «фатальной ошибки». Ваш код будет выглядеть примерно так:

(Edit: Отредактированный код для включения выхода, когда есть фатальная ошибка):

Sub DoThings() 
On Error GoTo SmallError 
    Dim fatalExit As Boolean 
    'Coding Happens 
    Do While(conditionhere) 
     'Looping things happen 
LoopResume: 
     count = count + 1 
    Loop 
On Error Goto SmallError2 
'Finishing code happens 
    Exit Sub 
SmallError: 
    handleError Err.Source, Err.Description, fatalExit 
    If fatalExit Then 
     Exit Sub 
    Else 
     Resume LoopResume 
    End If 
SmallError2: 
    handleError Err.Source, Err.Description, fatalExit 
    Exit Sub 
End Sub 

Private Sub handleError(ByVal source As String,ByVal description As String, ByRef fatalExit As Boolean) 
On Error Goto FatalError 
    'Do "small error" handling here 
    Exit Sub 
FatalError: 
    fatalExit = True 
    'Do "fatal error" handling here 
End Sub 
+0

В этом случае фатальная ошибка не будет выходить из подпакета, хотя. Он выйдет из handleError, но продолжит работу с DoThings. Мне нужен способ вернуться из DoThings sub на фатальную ошибку. – steventnorris

+0

@steventnorris Посмотреть отредактированный код – GTG

0

... Вас в вашем Goto, а не FatalError, что не приведет вас в нужное место ...

Обновите свой код:

On Error GoTo FatalError 
+0

Это просто опечатка. Извинения. – steventnorris