質問
VB6アプリケーションを持っています。エラーが何であったか、エラーが発生した正確な場所を教えてくれる、優れたエラー処理機能を入れたいのですが、誰かがこれを行う良い方法を提案できますか
解決
他のヒント
まずは取りに行ってください Visual Basic 6 用 MZTools, 、無料で非常に貴重です。次に、すべての関数 (はい、すべての関数) にカスタム エラー ハンドラーを追加します。私たちが使用するエラー ハンドラーは次のようになります。
On Error GoTo {PROCEDURE_NAME}_Error
{PROCEDURE_BODY}
On Error GoTo 0
Exit {PROCEDURE_TYPE}
{PROCEDURE_NAME}_Error:
LogError "Error " & Err.Number & " (" & Err.Description & ") in line " & Erl & _
", in procedure {PROCEDURE_NAME} of {MODULE_TYPE} {MODULE_NAME}"
次に、エラーをディスクに記録する LogError 関数を作成します。次に、コードをリリースする前に、すべての関数に行番号を追加します (これは MZTools にも組み込まれています)。今後は、発生したすべてのことをエラー ログから知ることができます。可能であれば、エラー ログもアップロードし、実際に現場からライブで検査してください。
これは、VB6 の予期しないグローバル エラー処理 (VB6 の多くの欠陥の 1 つ) に対してできる最善の方法であり、実際には、これは予期しないエラーを見つける場合にのみ使用する必要があります。特定の状況でエラーが発生する可能性があることがわかっている場合は、その特定のエラーを捕捉して処理する必要があります。特定のセクションで発生するエラーが不安定性 (ファイル IO、メモリの問題など) を引き起こすことがわかっている場合は、ユーザーに警告し、「不明な状態」にあり、「悪いこと」が起こる可能性があることを知らせます。ユーザーに情報を提供するために、明らかにフレンドリーな用語を使用しますが、恐怖を与えないでください。
追加のモジュールを必要としない簡単な方法で、クラス モジュールに役立ちます。
各関数/サブルーチンをプリエンプトします。
On Error Goto Handler
ハンドラー/バブルアップ:
Handler:
Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description
ほら、ゲットーのスタック トレースです。
自家栽培のものを使用しています Error.bas
モジュールを使用して、レポートと再レイズを簡単に行うことができます。
その内容は次のとおりです (長さのために編集されています)。
Option Explicit
Public Sub ReportFrom(Source As Variant, Optional Procedure As String)
If Err.Number Then
'Backup Error Contents'
Dim ErrNumber As Long: ErrNumber = Err.Number
Dim ErrSource As String: ErrSource = Err.Source
Dim ErrDescription As String: ErrDescription = Err.Description
Dim ErrHelpFile As String: ErrHelpFile = Err.HelpFile
Dim ErrHelpContext As Long: ErrHelpContext = Err.HelpContext
Dim ErrLastDllError As Long: ErrLastDllError = Err.LastDllError
On Error Resume Next
'Retrieve Source Name'
Dim SourceName As String
If VarType(Source) = vbObject Then
SourceName = TypeName(Source)
Else
SourceName = CStr(Source)
End If
If LenB(Procedure) Then
SourceName = SourceName & "." & Procedure
End If
Err.Clear
'Do your normal error reporting including logging, etc'
MsgBox "Error " & CStr(ErrNumber) & vbLf & "Source: " & ErrSource & vbCrLf & "Procedure: " & SourceName & vbLf & "Description: " & ErrDescription & vbLf & "Last DLL Error: " & Hex$(ErrLastDllError)
'Report failure in logging'
If Err.Number Then
MsgBox "Additionally, the error failed to be logged properly"
Err.Clear
End If
End If
End Sub
Public Sub Reraise(Optional ByVal NewSource As String)
If LenB(NewSource) Then
NewSource = NewSource & " -> " & Err.Source
Else
NewSource = Err.Source
End If
Err.Raise Err.Number, NewSource, Err.Description, Err.HelpFile, Err.HelpContext
End Sub
エラーの報告は次のように簡単です。
Public Sub Form_Load()
On Error Goto HError
MsgBox 1/0
Exit Sub
HError:
Error.ReportFrom Me, "Form_Load"
End Sub
エラーを再発生させるのは呼び出しと同じくらい簡単です Error.Reraise
新しいソースで。
取得することは可能ですが、 Source
そして Procedure
シンボリック デバッグ情報を使用してコンパイルした場合、コール スタックからのパラメーターは、運用アプリケーションで使用するには十分な信頼性がありません。
はい、Kris のアドバイスに従い、MZTools を入手してください。
ERL がエラー ハンドラで報告する複雑なプロシージャの領域に行番号を追加して、エラーの原因となっている領域を追跡できます。
10
...group of statements
20
...group of statements
30
...and so on
使用する
dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"
On Error ステートメントと Err オブジェクトを使用します。