2008-09-22 6 views
14

У меня есть приложение VB6, я хочу добавить в него хорошую обработку ошибок, которая может рассказать мне, что было ошибкой и точным местом, когда это произошло, может ли кто-нибудь предложить хороший способ для этогоКаков наилучший способ обработки ошибок в VB6

+0

Я удалил тег «in». – 2008-09-22 17:36:13

+0

Я также поменял два отдельных тега «ошибка» и «обработка» на «обработку ошибок». – 2008-09-22 17:37:02

ответ

2
ON ERROR GOTO 

и объект

Err 

.

Существует учебное пособие here.

28

Прежде всего, зайдите на бесплатное и бесценное 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 (один из многих его недостатков), и действительно это нужно использовать только для поиска неожиданных ошибок. Если вы знаете, что если есть вероятность возникновения ошибки в определенной ситуации, вы должны поймать эту конкретную ошибку и обработать ее. Если вы знаете, что ошибка, возникающая в определенном разделе, приведет к нестабильности (File IO, Memory Issues и т. Д.), Предупредите пользователя и узнайте, что вы находитесь в «неизвестном состоянии» и что, вероятно, происходят «плохие вещи». Очевидно, используйте дружественные условия, чтобы информировать пользователя, но не напуганы.

+0

Крис. Я хотел бы дать вам два ответа на этот ответ. Очень хороший ответ! – 2008-09-22 17:44:18

+0

Почему вы добавляете сообщение об ошибке «Перейти к 0» перед выходом? Я понимаю, что при выходе Exit (Function | Sub) текущий обработчик ошибок автоматически теряет область. – 2008-09-22 17:56:13

+0

Кроме того, если исходный плакат делает то, что вы сказали, любая вызывающая процедура будет не обращать внимания на то, что произошла ошибка и продолжит обработку. Как вы оправились от ошибки? – 2008-09-22 17:58:21

0

Используйте оператор On Error и объект Err.

1

Да, возьмите совет Криса и получите MZTools.

Вы можете добавить номера строк, чтобы отделить области сложных процедур, которые ERL будет сообщать в обработчике ошибок, чтобы отслеживать, в какой области возникает ошибка.

10 
    ...group of statements 
20 
    ...group of statements 
30 
    ...and so on 
10

простой способ без дополнительных модулей, полезные для класса модулей:

упредить каждую функцию/Subs:

On Error Goto Handler 

Обработчика/bubbleup:

Handler: 
    Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description 

вуаля , трассировка стека гетто.

4

Я использую самодельный модуль 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 параметров из стека вызовов при компиляции с символической отладочной информацией, это не достаточно надежно для использования в производственных приложениях

2

Использования на

dim errhndl as string 
on error goto errhndl 
errhndl: 
msgbox "Error"