私はVB6アプリケーションを持っています。エラーが何であり、それが発生した正確な場所を教えてくれる良いエラー処理関数を入れたいのですが、誰でもこれを行う良い方法を提案できますか?
7 に答える
まず、MZTools for Visual Basic 6 を入手してください。これは無料で非常に価値があります。次に、すべての関数 (はい、すべての関数) にカスタム エラー ハンドラーを追加します。使用するエラー ハンドラは次のようになります。
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 の予期しないグローバル エラー処理 (多くの欠陥の 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
、本番アプリケーションで使用するには十分な信頼性がありません。
使用する
dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"
はい、Kris のアドバイスに従って、MZTools を入手してください。
ERL がエラー ハンドラで報告する複雑な手順のセクション オフ領域に行番号を追加して、エラーの原因となっている領域を追跡できます。
10
...group of statements
20
...group of statements
30
...and so on
On Error ステートメントと Err オブジェクトを使用します。