0

エラー処理ブロックを終了することは推奨されていないことをどこかで読みました。悲しいことに、彼らは理由を説明しませんでしたか?

なぜそうなのか、興味がありました。Exit Function の前の「On Error Goto 0」での議論でこれに関連するものを見つけましたが、それが決定的な答えであるかどうかはわかりません。彼らは、Err オブジェクトがクリアされていないことについて話します。それが唯一の問題ですか。そうであれば、回避策はありますか?

これは間違っていますか?もしそうなら、関数を終了するための推奨される方法は何ですか? 私は go to ステートメントの強力な支持者ではありません。コードを理解するのが難しくなります。

    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
4

4 に答える 4

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
于 2012-05-09T05:20:35.037 に答える
1

(注意してください!!)に関する警告を除けば、On Error Resume Nextこのコードには問題はありません。エラー処理ステートメントのスコープは Foo2 Sub であり、終了すると有効期限が切れます。For ブロック内で別の Sub を呼び出すと、それ自体が他の Sub を呼び出す可能性があるため、危険が生じます。これらの潜水艦は On Error Resume Next を継承し、それらから発生したエラーが飲み込まれると、何年にもわたって悪夢をもたらします...

于 2012-05-09T09:07:47.950 に答える
0

VB6での私の過去の経験では、ResumeNextを使用することは良い考えではありませんでした。私はそれを使ったことがありません。私のコードはエラーを完全に回避するために最善を尽くしました、そして、エラーが起こった場合、それは常にエラーハンドラーブロックに行き着きました。あなたがリンクした質問は、私が自由に使用したMZToolsの使用法を示しています。

ですから、私のポイントは、Resume Nextコードはおそらく単なる演習であり、実際の本番コードではないということです。それが当てはまる場合は、Exit Subの前にErrオブジェクトをクリアする必要はありません。これは、Errオブジェクトにはとにかく何も含まれていないためです。DIDでエラーが発生した場合は、ErrorHandlerラベルに移動し、そこから続行します。そのハンドラーは、そうです。理想的には、Errオブジェクトを使用して何かを実行してから、呼び出し元に適切に戻ります。

于 2012-05-09T06:28:14.927 に答える
0

コード行を次のように再配置し、exit サブ関数または exit 関数が常に 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
于 2012-05-11T14:12:01.340 に答える