2009-09-04 16 views
1

私の主な呼び出しプロシージャでエラーハンドラを使用していて、他のプロシージャをそのエラーハンドラにロールアップさせるだけです。VB6エラーの伝播

毎回エラーをクリアする必要がありますか?または、End Subでエラーハンドラを続行するのではなく、Exit Exitを実行する必要がありますか?

私は最初のエラーをキャッチする可能性があり、他のエラーは処理されないことがあるので、私は尋ねています。

ご迷惑をおかけして申し訳ありません。私は何を言っているのか分かりません。

ありがとうございます!

編集:これのようなものです。これは必要ですか?

Public Sub SubA() 
On Error Goto ProcError 

    ' other code 
    MsgBox FuncA() 

ProcExit: 
    Exit Sub 

ProcError: 
    MsgBox Err.Description 
    Resume ProcExit 
End Sub 
+1

質問を示す独自のコード(またはその一部)を投稿してください。 – bugmagnet

+0

ここで、サンプルコードごとにエラーをクリアしていますか? – shahkalpesh

+0

さて、私は "Resume ProcExit"はErr.Clearと同じことをしています。 しかし、私はそのように投稿したコードはなぜですか?なぜ「再開ProcExit」ですか?ちょうどそのエラーをクリアするには?同じ手順で次の潜在的なエラーを処理することができますか? –

答えて

2

OP:毎回エラーをクリアしてください。または、End Subでエラーハンドラを続行するのではなく、Exit Exitを実行する必要がありますか?

エラーをクリアすることはどういう意味ですか?
は通常、手順はあなたがエラーハンドラを追加しないことを選択することができ、このように

public sub myProcedure() 
on error goto e: 
'statements that could raise error 
exit sub 

e: 
Log err.Number, err.Description, "error occurred in myProcedure" 
end sub 

OR

を書かれています。その場合、エラーは呼び出し元(または処理されるプロシージャ)に伝播されます。

&あなたの期待を達成しようとしているもののサンプルコードを投稿してください。

編集:ここではあなたが掲示するコードは、あなたの特定の例では

Public Sub SubA() 
On Error Goto ProcError 

    ' other code 
    MsgBox FuncA() 
exit sub 'put exit sub otherwise it will execute the line below, even if no error 

ProcExit: 
'this statement will get executed after the error msgbox is shown 
msgbox "Reached ProcExit" 
Exit Sub 

ProcError: 
MsgBox Err.Description 'catch the error and show the msgbox 
'error is cleared the point it reaches ProcError 
'Resume ProcExit acts as goto, to execute any statements after the error is handled 
Resume ProcExit 
End Sub 
+0

ここでは例ですが、必要かどうかを知りたいこれを実行してエラーをクリアした後、プログラムを実行し続けます。 Public Sub SubA() エラー時にエラーが発生しました。ProC Error '他のコード メッセージボックスFUNCA() ProcExit: 終了サブ ProcError: メッセージボックスErr.Description再開ProcExit –

1

を意味するものである、あなたはパターンがエラーをキャッチに基づいているため、エラーをクリアする必要はありません。それは悪くはないけど:

ProcExit: 
    Exit Sub 

ProcError: 
    MsgBox Err.Description 
    Err.Clear 
    Resume ProcExit 

を今、あなたはあなたの代わりにそれらを引くのエラーのチェックパターンを持っていた場合は、[はい、あなたはそれをクリアする必要があるだろう。ここに小さな例があります:

On Error Resume Next 
Dim o as Object 

Set o = myCollection(someKey) 

if Err.Number <> 0 then 
    ... respond to error 
    Err.Clear 

私はこれが役立つことを望みます。

1

期待どおりにSubを終了するたびにErrオブジェクトが消去されます(エラーは発生しません)。あなたの例では、Resume ProcExitステートメントは不要です。あなたはErrオブジェクトをクリアするExit Subステートメントを使用する必要はありません

Public Sub SubA() 
    On Error Goto ProcError 
    MsgBox FuncA() 
ProcExit: 
    Exit Sub 
ProcError: 
    MsgBox Err.Description 
    Resume ProcExit 
End Sub 

Public Sub SubA() 
    On Error Goto ProcError 
    MsgBox FuncA() 
    Exit Sub 
ProcError: 
    MsgBox Err.Description 
End Sub 

:次の二つの潜水艦は、同じように振る舞います。ちょうどあなたがEnd Subを押すと、サブの下に落ちて同じ効果があります。

メインプロシージャのエラーハンドラに「他のプロシージャ」からのエラーを「ロールアップ」する(より良い単語が伝播される)ようにするには、エラーハンドラを含めないでください。たとえば、MainがSubAを呼び出し、SubAがFuncAを呼び出すとします。 FuncAでエラーが発生します。あなたの例のように、メッセージボックスを表示するだけでFuncAのエラーを処理すると、コードはSubAで実行を継続しますが、FuncAで何か問題が発生し、SubAが認識しないために不安定な状態になりますそれ。

1つのオプションは、エラーハンドラをSubAとFuncAに入れないことです。 FuncAでエラーが発生すると、それはSubAに提起され、SubAが正常に処理されたMainに持ち上げられます。

エラーをトラップしてログに記録してから、再度レイズすることをお勧めします。その後、エラーハンドラを使用してエラーが最終的にメインサブに送られると、より多くの情報を扱うことができます。