2009-04-10 12 views
8

いくつかの壊れたサードパーティのハードウェアを処理するために、いくつかの場所にさまざまな "On Error Goto"エラーハンドラを持つコードがあります。私はエラートラップを持たないルーチンで呼び出されるルーチンでオーバーフローエラー(Err変数から読み込み)を取得していました。私はいつも、エラートラップは宣言されたルーチンでのみ有効だと考えましたが、サブルーチンのエラーが呼び出し関数のエラートラップに移動する可能性があります。VB6でデフォルトのエラー処理を再度有効にする方法

私は呼び出し関数のエラートラップをオフにして、私のオーバーフローが見つかり、すべてがうまくいきました。しかし、それを行う前に、VBをそのルーチン内のデフォルトのエラー処理に戻すためのプログラム的な方法を見つけようとしていましたが、デバッグするために外部コードを変更する必要はありませんでした。私は見つけることができる唯一のエラーコマンド:

 On Error GoTo [label] 
    On Error Resume Next 
    On Error Goto 0 
    On Error GoTo -1

手動エラー処理上のすべてのターン - (バックVB6のデフォルトに)それをオフにする方法はありますか?

答えて

10

これはVB6マニュアルError Handling Hierarchyで詳しく説明されています。 On Error Goto 0は、現在のプロシージャのエラーハンドラを無効にします。

エラーが手順と で発生した場合、この手順は有効 エラーハンドラを持っていませんが、Visual Basicは呼び出しリスト内の保留 手順を逆方向に を検索 - 最初 有効なエラーハンドラを実行しますそれは見つける。 に有効なエラー ハンドラがコールリストのどこにも見つからない場合、 はデフォルトの予期しないエラー を表示し、実行を停止します。他の人が言ったように

、あなたは、オプション - 一般ツールタブに移動し、すべてのエラーブレークを選択することができます。これにより、すべてのOn Errorステートメントが効果的に無効になります。つまり、IDEはすべてのエラーで直ちに中断します。

VB6コードが通常の操作の一部としてエラーをスローすると、それは苛立つ可能性があります。たとえば、ファイルが存在するかどうかをチェックしたり、ユーザーが共通のダイアログでキャンセルを押した場合などです。これらの行で毎回IDEが壊れないようにします。しかし、予期しないエラーでプログラムがクラッシュするのを防ぐために、すべてのイベント処理プロシージャで定型エラーハンドラを使用することができます。しかし、IDEがエラーで破損しないため、問題をデバッグしているときには迷惑です。 1つは、IDEで実行中のエラーハンドラをオフにして、ビルドされた実行可能ファイルに保持する方法です。あなたはこれを好きです。

これらの機能をモジュールにドロップします。

Public Function InIDE() As Boolean 
    Debug.Assert Not TestIDE(InIDE) 
End Function 

Private Function TestIDE(Test As Boolean) As Boolean 
    Test = True 
End Function 

次に、このようなエラーハンドラを記述できます。

Private Sub Form_Load() 
    If Not InIDE() Then On Error Goto PreventCrashes 
    <lots of code> 
    Exit Sub 

PreventCrashes: 
    <report the error> 
End Sub 

hereから挟まれている。もう1つのヒント - 空きアドインMZToolsを使用して、これらの定型エラーハンドラを自動的に追加します。プロダクション品質のコードでは、さらに進んですべてのルーチンにエラーハンドラを入れてghetto stack traceを作成することができます。すべてのエラーハンドラですぐにエラーを記録することもできます。

編集:Antは正しくOn Error Goto -1VB.Net statementであり、VB6では無効であると指摘しています。

EDIT:ArvoとOneNerdは、VB6のエラー処理で、最後にteardownブロックをエミュレートする興味深い議論で答えを書いています。 this questionでの議論もまた価値があります。

0

/ツール/オプション/一般/エラーは、あなたが望むものであるべき...それがスローにエラーが発生し、ひいては、おそらくRTLまでおくつろぎ必要があります...

長いことですが、私はそれがあなたが望むものだと確信しています。

on error resume next 

はちょうど便利な右があります...あなたはエラーが発生する可能性がありますあなたのコード内の

if err.Number <> 0 then 

文をたくさん持っている必要がありますので、次の文に

0
on error goto 0 

の取り扱い

+0

LarryF。 On Error Goto 0は、ルーチン自体のエラーハンドラを無効にしますが、ランタイムはアクティブなエラーハンドラの呼び出しスタックをバックアップします。ある場合は、エラーを処理します。 – MarkJ

+0

Opps ..私の悪い。私は記述されているように動作するvbScriptを考えていたに違いない。または、少なくともそれは慣れていた。 (私は最新バージョンが何であるかわかりませんが、最近変更された場合もあります) – LarryF

1

を継続していきますエラー処理のオン/オフを切り替えることができます。コードウィンドウを右クリックしてToggleを選択すると、 "すべてのエラーでブレーク"を選択できます。これは、すべての "On Error"ステートメントを無効にするという効果があります。エラー再開次でによってオンされた明示的なエラー処理をオフにする必要があり

0

はエラー後藤0でLarryF、に同意する必要があります。関数とサブルーチンには独自のスコープがあります。 Dr. Scripto at Microsoftから:私たちはしばしば がそうであるように、スクリプトの 先頭にOn Error Resume Nextを置く

、それはスクリプトの本体全体 に適用されます。しかし、後の例の にあるように、その範囲には関数またはサブルーチンが含まれていません。 関数またはサブルーチン内のエラーを処理する場合は、エラー オブジェクトを確認する前に、それぞれ に にOn Error Resume Nextを含める必要があります。

あなたは ターンのOn Errorでのエラーがハンドリングにエラー処理エラー後藤0で とオフだから、それが可能だと回すことができるあなたは、Errオブジェクトを確認し 、および それをオフにする直前に、次の再開 後でOn Error GoTo 0を返します。ここで

+0

ErmですがDr ScriptoはVBScriptについて話していますが、VB6に関する質問があります – MarkJ

1

は、私が何をすべきかです:今

'-- turn on error handling 
' 
On Error GoTo 0 
' 
'------------------------- 

:あなたのをSub Main()またはサブのForm_Load()サブでこのようにエラー処理の

最初のターン必要であれば、エラーが表示されます。

次に、のErrオブジェクトとの組み合わせでエラー後藤{ラベル}コマンドでとの次のエラーの再開でを使用します。 try/catch/finallyをエミュレートする例を次に示します。

Function MyFunction() as String '-- start of error block ' On Error Goto Catch ' do something here that might cause an error MyFunction = "IT WORKED" Goto Finally Catch: ' error occured - do something else MyFunction = Err.Description Err.Clear Finally: ' put your finally code here ' '-- end of error block End Function 
+0

+1 On Error Resume "最後に"ブロックすると、何か必要なものをセットアップするのにエラーが干渉する場合があります。私はForm_Load/Sub MainにOn Error Goto 0を置いた理由は分かりません。 – MarkJ

0

「On Error GoTo -1」はありません。どこにいるのか分かりません。

VB6例外処理については、マニュアルで非常に詳しく説明しています。

+1

私はそれがVB.NETステートメントだと思います: http://msdn.microsoft.com/en-us/library/5hsw66as(VS.80).aspx – Ant

3

エラーステータスをリセットする明確かつ簡単な方法 - キーワードResumeを使用してください。 3つの可能性があります。

Resume 
Resume Next 
Resume <Label> 

再開は、エラーのある行で実行を継続し、次の行で、次へを再開し、少なくとも話を再開ラベルは、ラベルで継続します。 VB6でtry-catch-finallyのような構造を作成するのに非常に便利です。 OneNerd答えから借りて修正:いくつかのsubsequentialエラーがFinallyブロックで発生した場合

Function MyFunction() as String 

'-- start of error block 
' 
On Error Goto Catch 
    ' do something here that might cause an error 
    MyFunction = "IT WORKED" 
    Goto Finally 

    Catch: 
    ' error occured - do something else 
    MyFunction = Err.Description 
    Err.Clear 
    Resume Finally   ''added to clear error status 

Finally: 
    On Error Resume Next ''added to avoid repeated errors 
    ' put your finally code here 

' 
'-- end of error block 

End Function 

シンプルErr.Clearは、役に立ちません。 Resume最後に内部エラー状態をリセットします。

+0

On Error Resume Nextは内部エラー状態をリセットしますので、Err.ClearとResume最後に冗長です。個人的には、後藤は最終的にはより明確だと思う。最も重要なのは、End Functionの直前にErr.ClearまたはOn Error Goto 0を置きます。そうでない場合は、finallyブロックのエラー状態が呼び出し元に戻ります!! – MarkJ

+0

On Error Resume Next(エラー後)は、エラー状態をリセットしません。私はちょうど100%確実であることを本当にテストしました。 – Arvo

関連する問題