Каков наилучший способ найти подпрограмму или раздел кода, который не имеет обработчика ошибок - PullRequest
1 голос
/ 24 февраля 2012

Я поддерживаю большое приложение VB6, и вчера покупатель сообщает об ошибке «Подстрочный индекс выходит за пределы допустимого диапазона», после чего при нажатии на него происходит выход из приложения.

Мы используем стандартную процедуру обработки ошибок, которая выдает окно сообщения и записывает ошибку в файл, и тот факт, что ничего из этого не произошло, заставляет меня думать, что в рассматриваемой строке кода нет обработки ошибок.

Теперь ... как мне найти эту строку кода в моем проекте?

Я могу написать что-нибудь для сканирования каждого файла, отмечая, когда я вижу on error... внутри сабвуфера и т. Д., И т. Д., Но кто-нибудь может придумать лучший / более быстрый способ? Существуют ли какие-либо инструменты, которые делают подобные вещи?

1 Ответ

0 голосов
/ 24 февраля 2012

Я написал этот ( VB.NET ) код для извлечения этой информации (обратите внимание, что кодирование немного быстрое и грязное, но, кажется, работает)

Это не справится с on error goto 0 и on 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...