как лучше обрабатывать ошибки в VB6
-
02-07-2019 - |
Вопрос
У меня есть приложение VB6, я хочу добавить в него хорошую функцию обработки ошибок, которая может сказать мне, в чем заключалась ошибка и точное место, когда она произошла, может ли кто-нибудь предложить хороший способ сделать это
Решение
Другие советы
Прежде всего, иди возьми MZTools для 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 (один из многих его недостатков), и на самом деле это следует использовать только для поиска неожиданных ошибок.Если вы знаете, что если в определенной ситуации существует вероятность возникновения ошибки, вам следует поймать эту конкретную ошибку и обработать ее.Если вы знаете, что ошибка, возникающая в определенном разделе, приведет к нестабильности (вывод файла, проблемы с памятью и т. д.), предупредите пользователя и знайте, что вы находитесь в «неизвестном состоянии» и что, вероятно, произойдут «плохие вещи».Очевидно, используйте дружелюбные термины, чтобы держать пользователя в курсе, но не напугать.
простой способ без дополнительных модулей, полезный для модулей классов:
вытеснять каждую функцию/подпрограмму:
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
параметры из стека вызовов, если вы компилируете с символической отладочной информацией, это недостаточно надежно для использования в производственных приложениях.
Да, прислушайтесь к совету Криса и приобретите 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.