VB6 アプリで、さまざまな場所で実行時エラーが発生しています。
これはエラー処理が不十分な結果であることはわかっていますが、コードを分析して実行時エラーの影響を受けやすい場所を確認することはできますか?
VB6 アプリで、さまざまな場所で実行時エラーが発生しています。
これはエラー処理が不十分な結果であることはわかっていますが、コードを分析して実行時エラーの影響を受けやすい場所を確認することはできますか?
どのアプリケーションも、外部リソースへの呼び出しに関するエラー処理が行われない実行時エラーの影響を受けやすいため、これらのポイントを開始点として特定できます。
私は、エラー処理をVB6コードにレトロフィットできる無料のツール(何年も前)を使用しました。これは、少なくともエラーとそれらが発生したポイントを記録します。
ここにあります: VB6 で簡単にエラーを処理するための HuntErr アドイン
コード ベース内のすべてのメソッド (関数、サブルーチン、プロパティなど) にエラー処理ステートメントがあることを確認する必要があります。すべてのエラーが実行時エラーを生成できるわけではないことはおそらく事実ですが、事前に多くの分析を行わなくても、アプリケーションがクラッシュするのを防ぐことができます。
実行可能なコード行の前に、「On Error GoTo...」というラベルが付いたステートメントがあることを確認し、メソッドの最後にエラー処理コードを含むそのラベルを付けてください。このテキストの挿入を自動化できるMZ-Tools 3.0という無料のツールを使用しました。オプションに [エラー ハンドラー] タブがあり、挿入するテキストとその場所を指定できます。これは私のように見えるものです:
On Error GoTo l{PROCEDURE_NAME}_Error
{PROCEDURE_BODY}
Exit {PROCEDURE_TYPE}
l{PROCEDURE_NAME}_Error:
LogError "{MODULE_NAME}", "{PROCEDURE_NAME}", Err, Err.Description
次に、LogError 関数が存在することを確認し、確認できるログ ファイルにエラーを書き込みます。
VB6 アプリの実行時エラーの一般的な原因には、次のものがあります。
したがって、他の人が提案したことを実行し、実際のエラーがどこから発生しているかを分析することに加えて、コード内でこれらのような領域を探し、それらの周りに適切なエラー処理を配置することから始めることができます. 多くの場合、最善の「エラー処理」には On Error を使用することはまったく含まれていませんが、次のような境界ケースをチェックすることでエラーを事前に防止することに注意してください。
等...
ここには、On Error GoTo
推奨事項と、bwarnerが言及している亀裂を通り抜ける一般的なエラーの両方に関するいくつかの良い答えがあります。
しかし、範囲を広げて組み込みツールを利用して、ブレークポイント、式の監視などのコードを分析し、特に実行時エラーのデバッグに適したもの、ローカル ウィンドウ (デバッグでは見過ごされがちですが、非常に強力です)、およびコール スタックを使用します。ここから多くの優れた情報を得ることができます:コードのデバッグとエラーの処理
それについて考えるべき他のことが役立つかもしれません:
VB6 では、イベント関数がエラー処理なしで呼び出されると、まさにランタイム エラーが発生します。したがって、少なくともすべてのイベント処理関数 (Form.Open() など) は、エラー ハンドラーで囲まれている必要があります (はい、VB6 にはエラー ハンドラーがないことはわかっています)。このような):
これをすべてのイベント処理関数の最初の行として使用します (これは、最後に On Error を設定する大きな有効なラベルです)。
¦¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯: On Error GoTo ErrorHandler:
これらすべての関数の最後でこれを使用します。
¦____________________________________________________________________________________________________________________________________: Exit Sub
ErrorHandler: handleError CodeDb, "Form_frm_filter_deletecolum", "cmd_deletecolum_Click", err.Number, err.description, err.Source, err.LastDllError, err.Helpfile, err.HelpContext, Erl: err.Clear
ただし、2 つの文字列をモジュール名と関数名に置き換えます。On Error Goto 0
そして、それぞれを に置き換えますOn Error Goto ErrorHandler
。
ここで、指定された引数で関数 handleError を作成し (私のアプリでは、バグ追跡システムにバグ レポートを自動的に送信します)、適切なエラー メッセージを表示します。
エラーが発生した行を記憶し、完全な情報を蓄積するために、同様の行を他のすべての行 (非イベント関数、または他の関数によって呼び出されたばかりの関数) に追加する事前構築済みのプロセスを用意することで、これをさらに推し進めました。スタック トレース (ええ、VB6 のスタック トレース!)。さらに、このプロセスでは、各行に行番号が追加されるため、エラー ハンドラの Erl 部分で指定されます。
私たちのツールはいくつかの MS Access モジュールとして書かれているので、単純に提供することはできませんが、どこに行けばよいかがわかります。
Ryan の回答と応答のコメントに従って、すべてのルーチンにエラー処理を配置する必要はありません。すべてのイベントと(および API コールバックがない場合は API コールバック) だけです。Sub Main()
API コールバックは、Win32API によって直接呼び出されるルーチンを参照し、ほとんどの場合は を
Declared
使用して関数に渡されますAddressOf
。(つまり、コードを検索してAddressOf
、引数として言及されているすべてのルーチンに、エラーをキャッチし、エラーが発生しないようにするエラー ハンドラーがあることを確認します。)
そして、これが元の質問に実際には答えていないことに気付きました (ただし、Ryan の回答に対するコメントを考えると、最初のステップとしては適切です): すべてのイベントなどでエラー処理を行うと、すべてのエラーをキャッチできます。 、しかし、すべてのエラーがどこで発生したかを直接分析することはできません。各エラーの正確な原因をより正確に特定するには、少なくともエラーをログに記録するイベントによって呼び出されるすべてのルーチンにエラー ログを拡張する必要があります。