parsing - 查找没有错误处理程序的子例程或代码段的最佳方法是什么

标签 parsing vb6 error-handling

我维护了一个大型VB6应用程序,昨天一位客户在屏幕上报告了“下标超出范围错误”,因此单击它退出了该应用程序。

我们使用一个标准的错误处理例程,该例程抛出一个消息框并将错误记录到文件中,而这两种情况均未发生,这一事实使我认为所讨论的代码行没有任何错误处理。

现在..我该如何找到这行代码在我的项目中的位置?

我可以写一些内容来扫描每个文件,注意在子等中看到on error...时的情况,但是有人能想到更好/更快的方法吗?有没有做这种事情的工具?

最佳答案

我编写了此( VB.NET )代码以提取此信息(请注意,编码虽然又快又脏,但似乎可以工作)

它不会在同一子例程中处理on error goto 0on error goto [label]:

Private Sub SearchForNoErrorHandlers(ByVal path As String)

        Dim line As String, subName As String = "", inSub As Boolean = False, handlerFound As Boolean = False

        For Each file As String In Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
            'Debug.WriteLine(file) 'gives the full path and filename of any files found
            If file.EndsWith(".bas") OrElse file.EndsWith(".cls") OrElse file.EndsWith(".frm") Then
                Using sr As New StreamReader(file)
                    Do Until sr.EndOfStream
                        line = sr.ReadLine
                        'Debug.WriteLine(line)
                        If IsStartOfSub(line) AndAlso Not inSub Then
                            subName = line
                            inSub = True
                            handlerFound = False

                        ElseIf IsEndOfSub(line) AndAlso inSub Then
                            inSub = False
                            If handlerFound = False Then
                                Debug.WriteLine("** No handler found for file {0} in Sub: {1}", file, subName)
                            End If

                        ElseIf line.ToUpper.Contains("ON ERROR") AndAlso inSub Then
                            handlerFound = True

                        End If
                    Loop
                End Using
            End If
        Next

    End Sub

    Private Function IsStartOfSub(ByVal line As String) As Boolean
        Dim subTextPosition As Integer = line.ToUpper.IndexOf("SUB ")
        Dim functionTextPosition As Integer = line.ToUpper.IndexOf("FUNCTION ")
        Dim openBracket As Integer = line.IndexOf("(")
        Dim closeBracket As Integer = line.IndexOf(")")
        If subTextPosition >= 0 AndAlso openBracket >= 0 AndAlso closeBracket >= 0 AndAlso closeBracket > openBracket AndAlso openBracket > subTextPosition Then
            Return True
        ElseIf functionTextPosition >= 0 AndAlso openBracket >= 0 AndAlso closeBracket >= 0 AndAlso closeBracket > openBracket AndAlso openBracket > functionTextPosition Then
            Return True
        Else
            Return False
        End If
    End Function

    Private Function IsEndOfSub(ByVal line As String) As Boolean
        Return (line.ToUpper.Contains("END SUB") OrElse line.ToUpper.Contains("END FUNCTION"))
    End Function

关于parsing - 查找没有错误处理程序的子例程或代码段的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9427919/

相关文章:

python - 如何在 python 中查找英语词典?

Vb6:通过浏览按钮选择稍后使用的文件

string - 在 Go 中处理动态错误(特别是 database/sql 包)

angular - 不能在 Angular 2 的 setTimeout 方法中使用 router.navigate

Python:解析具有各种字段计数的冒号分隔文件

c++ - 使用 Boost Spirit Qi 解析包含文字的字符串

vb6 - 如何通过 USB HID API 从游戏 Controller 请求输入数据?

javascript - 抛出新错误(字符串)未在 F12 中显示

android - android中如何进行XML解析?

com - 如何使用 COM 公开 .netstandard2.0 库以在 VB6 中使用?