1

一連の関数呼び出しを持つ Access 2007 データベースがあります。エラー情報でテーブルを更新し、エラー通知メールを送信するエラー処理サブを呼び出すすべてのサブおよび関数で On Error Goto Error_Handler を使用しています。これをこのように設定したので、任意のサブまたは関数から呼び出すことができるエラー処理モジュールを 1 つだけ持つことができました。

「メイン以外の」サブルーチンまたは関数のいずれかでエラーが発生したときに何が起こっているかというと、エラー処理関数が呼び出されますが (期待どおりに正しく動作しています)、コードの実行はメイン プロシージャで続行され、サブの後にあるものは何でも使用されます。エラーが発生しました(私の場合、誤った「成功」メールを送信しました)。明確にするために、すべてのサブルーチンと関数には「On Error Goto Error_Handler」があるため、On Error Resume Next の問題ではありません。

サブによって呼び出された別のエラー処理関数を持ち、「メイン」プロシージャの実行を停止させる方法はありますか? (この場合、レコードセットを 1 秒に 1 回ループし、エラーがログに記録されたイベントを再実行しようとしないタイマーのフォームがあるため、誤った成功の兆候を防ぐために手順を終了する必要があります。)

4

1 に答える 1

4

あなたがしていることを正しく読んでいるなら、それは私が最初に似たようなことを始めたときに陥ったのと同じ罠です. 問題は、エラーが非メインルーチンで「処理」されているため、エラー処理システムに関する限り、それは完了してほこりを払っていることです。プログラム制御フローがメイン ルーチンに戻ると、エラー状態はなくなります。疑似コードで説明できるかどうか見てみましょう。

MainFunction()

   On Error Goto ErrorHandler

   Call MySubFunction

   CodeToSendSuccessEmail    

ExitPoint:
'Here we do any necessary cleanup.

Exit Function

ErrorHandler:

   Call MyErrorRoutine
   Resume ExitPoint

End Function


Function MySubFunction()

   On Error Goto ErrorHandler

   DoStuffThatCauseAnError

ExitPoint:
Exit Function

ErrorHandler:

   Call MyErrorRoutine
   Resume ExitPoint

End Function

では、MySubFunction でエラーが発生した場合はどうなるでしょうか。その関数の ErrorHandler: ラベルにジャンプします。これを行うと、エラー処理システムに関する限り、エラーは処理されているため、その関数を離れ (私の場合は ExitPoint: ラベルと Exit Function ステートメントを介して)、MainFunction に戻ります。その場合、すでに処理されているため、エラーは発生しなくなります。その結果、「成功」の電子メールが送信されます。

このような状況を処理するための最も迅速で汚い方法は、サブプロシージャーにエラー処理をまったく入れないことです。このようにして、エラーが発生すると、この場合は MainFunction にあるエラー ハンドラーに遭遇するまで、すぐにコール スタックにスローされます。その場合、MainFunction の ErrorHandler: ラベルに直接ジャンプします。

そのようにすることの欠点は、エラーが発生した関数を正確に追跡できないことです。私が実際に行ったことは、サブルーチンエラーハンドラにこれを行わせることでした:エラー (およびその場所) をアプリケーションのログ ファイルに記録します。(b) 変数の Err.Number と Err.Description に注意してください。次に (c) これらの変数の値を使用して、ExitPoint: ラベルに戻った後にエラーを再発生させ、スタックに逆流するようにします。

そうすれば、エラーの発生元を確実に知ることができますが、ユーザーへのエラーメッセージの主な表示 (この場合は、テーブルに書き込み、電子メールを送信することによる) は 1 回だけ行われます。つまり、最上位関数のみがメイン エラー ルーチンを呼び出します。

余談ですが、VB.Net と T-SQL で使用されている Try/Catch 構文に最初に出会ったときはかなり不安でしたが、実際にはエラー処理に多くの利点があり、ごまかす必要がないなどです。エラーが発生したときにスタックをトレースします。それは、Access で VBA を操作する上で盲目的に役立つというわけではありません。私が言ったように、それは単なる余談です。

于 2013-03-29T05:54:19.940 に答える