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 の回答に対するコメントを考えると、最初のステップとしては適切です): すべてのイベントなどでエラー処理を行うと、すべてのエラーをキャッチできます。 、しかし、すべてのエラーがどこで発生したかを直接分析することはできません。各エラーの正確な原因をより正確に特定するには、少なくともエラーをログに記録するイベントによって呼び出されるすべてのルーチンにエラー ログを拡張する必要があります。