2012-05-09 6 views
0

Я где-то читал, что выход из блока обработки ошибок не рекомендуется. К сожалению, они не дали объяснений, почему?Почему не удается выйти из подкаталога внутри блока обработчика ошибок?

Мне было любопытно, почему это так. Я нашел что-то связанное с этим в обсуждении на "On Error Goto 0" before Exit Function, но не уверен, что это окончательный ответ. Они говорят о том, что объект Err не очищается. Это единственная проблема, и если это так, то работа вокруг?

Это не так? Если да, то каков рекомендуемый способ выхода из функции? Я не являюсь большим сторонником перехода к заявлениям, они делают код более сложным.

Private Sub Foo2() 
     On Error Resume Next 
      'Multiple lines of code 

      If Not Foo(arg1,arg2) Then 
       Exit Sub 'Can I exit here? 
      End If 

      'Multiple lines of code 
     On Error GoTo 0 
    End Sub 
+3

10 'On Error Goto' абсолютно нормально, если используется с дисциплиной. Это эквивалент блока «Try ... Catch» на более современных языках. Определенно лучше, чем 'On Error Resume Next' – MarkJ

+3

' On Error Resume Next' является чистым злом, когда применяется к нескольким строкам кода, которые могут вызвать исключение, которое вы иначе не можете предотвратить. – Dabblernl

ответ

1

Если я правильно понимаю ваш вопрос, то лучше было бы это сделать что-то вроде:

Private Sub Foo2() 
    On Error Goto ErrHandler 
     'Multiple lines of code 

     If Not Foo(arg1,arg2) Then 
      Exit Sub 'Can I exit here? 
     End If 

     Multiple lines of code 

ErrHandler: 
    Error handling mechanism here. 
End Sub 
+0

Нет моего вопроса относительно вывода Ex в выражении if. Достаточно ли выйти из подкаталога внутри блока ошибок? – MAC

+0

On Error Resume Next - это сложный дьявол, он делает это, что позволяет выполнять следующую строку кодов даже после возникновения ошибки, поэтому в большинстве случаев она будет иметь неожиданные результаты. Как и в моем сообщении, лучше использовать механизм обработки ошибок, а не использовать последующее резюме ошибки, если вы на 100% не уверены, что возобновление после ошибки не повлияет на последовательную логику вашего кода. –

+0

@MAC наверняка вы можете выйти из блока внутри блока ошибок, оператор on on VB6 - это всего лишь метка, указывающая, куда идет система, если возникает ошибка, но ничего другого, поэтому это не будет проблемой, если вы выйдите из него в блоке с ошибкой – Nick

0

В моем прошлом опыте с VB6, используя Resume Next не было хорошей идеей. Я никогда не использовал его. Мой код сделал все возможное, чтобы избежать ошибок вообще, и в случае, когда это произошло, он всегда переходит к блоку обработчика ошибок. Вопрос, который вы связали, иллюстрирует использование MZTools, который я использовал в широком смысле.

Итак, я хочу сказать, что код возобновления следующего, скорее всего, просто упражнение, но не настоящий производственный код. Если это правда, тогда вам не нужно будет очищать объект Err до Exit Sub, потому что у объекта Err ничего не было бы в нем. Если вы столкнулись с ошибкой, он переместится на метку ErrorHandler и продолжит работу оттуда. Я, этот обработчик, да, в идеале вы бы хотели что-то сделать с объектом Err, а затем соответствующим образом вернуться к вызывающему.

1

Помимо предупреждений о On Error Resume Next (прислушайтесь к ним), никаких проблем с этим кодом нет. Объем оператора обработки ошибок - это Foo2 Sub, и он истекает, когда вы выходите из него. Опасности возникают при вызове другого Sub в блоке For, который сам по себе может вызывать другие Subs. Эти subs наследуют On Error Resume Next и дадут вам кошмары в течение многих лет после того, как ошибки, вызванные ими, будут проглочены ...

0

Я бы перестроил вашу кодовую строку и гарантировал, что функция выхода или выхода всегда приходит непосредственно перед ErrorHandler:

Private Sub Foo2() 
    On Error Goto ErrHandler 

    'Multiple lines of code 

    If Foo(arg1,arg2) Then 

     'Multiple lines of code 

    End If 

    Exit Sub 

    ErrHandler: 
    Error handling mechanism here. 
End Sub 
Смежные вопросы