2012-02-24 9 views
1

私は大きなVB6アプリケーションを管理していますが、昨日、顧客が「下付き文字が範囲外エラーです」というメッセージを表示すると、アプリ。エラーハンドラを持たないサブルーチンやコードセクションを見つける最良の方法

標準的なエラー処理ルーチンを使用して、メッセージボックスをスローし、エラーをファイルに記録します。これらのことが起こっていないということは、問題のコード行にエラー処理がないと思うようになります。

今、このコード行が私のプロジェクトのどこにあるのかを知りたいですか?

私はon error...がサブなどの中に入っているのを見て、各ファイルをスキャンするものを書くことができますが、誰かがより良い/より速い方法を考えることができますか?このようなことを行うツールはありますか?

答えて

0

私はそれは同じでon error goto 0on error goto [label]に対処しません

(コーディングが少し迅速かつ汚いですが、動作するように思われることに注意してください)この情報を抽出するために、この(VB.NET)コードを書きましたサブルーチン:

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 
関連する問題