none
Linha do Erro no codigo RRS feed

  • Pergunta

  • Boa tarde , Minha duvida de 'Hoje' é o seguinte, trabalho com um software de vendas bem completo, nele contem mais/menos 3 mil linhas.Se der um erro no meio dela vai ser muito foda procurar alem de demorado, então eu criei uma maneira que se der erro o soft cria uma Xml que me mostrará o Nome da tela, nome da função, e a mensagem padrão de erro.

    Eu quero que no relatório de erro mostre o numero da linha do Erro;....

    Se alguém souber me manda um exemplo de código Please..

    Att. João



    • Editado João Vitor R segunda-feira, 10 de fevereiro de 2014 17:25
    segunda-feira, 10 de fevereiro de 2014 12:29

Respostas

  • Modifiquei o código novamente e testei, funcionou aqui:

    Public Module ExceptionHelper
        <System.Runtime.CompilerServices.Extension> _
        Public Function LineNumber(e As Exception) As Integer
            Dim linenum As Integer = 0
            Try
                Dim stack As String = e.StackTrace
                Dim lineIndex As Integer = stack.LastIndexOf(":linha")
                Dim lineStr As String = stack.Substring(lineIndex)
                lineStr = Split(lineStr, " ")(1)
                linenum = Integer.Parse(lineStr)
            Catch
            End Try
            Return linenum
        End Function
    End Module


    Herbert Lausmann


    • Editado Herbert Lausmann terça-feira, 11 de fevereiro de 2014 14:13
    • Marcado como Resposta João Vitor R terça-feira, 11 de fevereiro de 2014 14:30
    terça-feira, 11 de fevereiro de 2014 14:12

Todas as Respostas

  • Olá,

    Veja esse exemplo em um Try Catch:

    Try
    	'Código aqui...
    Catch ex As Exception
    	' Get stack trace for the exception with source file information
    	Dim st = New StackTrace(ex, True)
    	' Get the top stack frame
    	Dim frame = st.GetFrame(0)
    	' Get the line number from the stack frame
    	Dim line = frame.GetFileLineNumber()
    End Try

    Você pode usar, também, a propriedade TargetSite que descreve o método em que ocorreu a exceção...


    Herbert Lausmann

    segunda-feira, 10 de fevereiro de 2014 13:07
  • Olá,

    Veja esse exemplo em um Try Catch:

    Try 'Código aqui... Catch ex As Exception

    Dim st = New StackTrace(ex, True) ' Get the top stack frame Dim frame = st.GetFrame(0) ' Get the line number from the stack frame Dim line = frame.GetFileLineNumber() End Try

    Você pode usar, também, a propriedade TargetSite que descreve o método em que ocorreu a exceção...


    Herbert Lausmann

    Desculpa  mas eu sou novato no ramo me ajuda mais um pouco aqui...Depois de declarar as variáveis dentro do catch eu não deveria utilizá-las ou manda-las fazer algo?Ou só colocar o código assim que já vai me mostrar mais detalhado...
    segunda-feira, 10 de fevereiro de 2014 14:42
  • A variável line é o número da linha que ocorre o erro. Ai você grava essa número no seu xml junto com as outras informações do erro.

    Herbert Lausmann

    segunda-feira, 10 de fevereiro de 2014 14:55
  • A variável line é o número da linha que ocorre o erro. Ai você grava essa número no seu xml junto com as outras informações do erro.

    Herbert Lausmann

    Mas eu joguei o Line no MSgbox e o Resultado só me mostra 0

    segunda-feira, 10 de fevereiro de 2014 15:06
  • Eu peguei este código do post abaixo:

    C# get line number which thrown exception

    Nele fala que o executável deve estar devidamente acompanhado com o seu arquivo de símbolos (O arquivo com o nome do executável e extensão "*.pdb").

    Neste outro thread:

    How to get error line number of code using try-catch

    É mencionado que o Debug Info deve estar no modo Full. (Para configurar isso vá em: Propriedades do Projeto > Build > Advanced > Debug Info)


    Herbert Lausmann

    • Marcado como Resposta João Vitor R segunda-feira, 10 de fevereiro de 2014 15:27
    • Não Marcado como Resposta João Vitor R terça-feira, 11 de fevereiro de 2014 10:02
    segunda-feira, 10 de fevereiro de 2014 15:24
  • coloque brack points e execute em modo de debug, utilize as teclas f10 e f11 para visualizar os valores que estão sendo passados e o possível motivo do erro.

    Atenciosamente, Marcio Nogueira Cardoso Pinto.

    segunda-feira, 10 de fevereiro de 2014 17:12
  •  

    Herbert Lausmann

    Seu código só me retorna 0 eu já tentei de tudo,sou novato na programação se puder facilitar um pouco o entendimento do trecho de código ficarei muito agradecido.

    Att. João

    Fico no Aguardo.
    • Editado João Vitor R segunda-feira, 10 de fevereiro de 2014 19:38
    segunda-feira, 10 de fevereiro de 2014 19:35
  • João,

    Se a minha resposta não está funcionando, desmarque-a, pois assim outros colegas do fórum que virem a sua pergunta poderão ajudar também, só marque como resposta se realmente funcionar.

    Eu estava lendo o post onde eu peguei o código e realmente teve gente que falou que só retornou 0, mas que para funcionar o seu programa deve ser compilado em no modo Debug Full para que seja gerado o arquivo PDB.

    Bom, eu encontrei outro código mais simples e creio que será melhor para você que está iniciando:

    1 - Adicione um arquivo de código vazio ao seu projeto.

    2 - Cole o seguinte código nele:

    Public Module ExceptionHelper
        <System.Runtime.CompilerServices.Extension> _
        Public Function LineNumber(e As Exception) As Integer
    
            Dim linenum As Integer = 0
            Try
                linenum = Convert.ToInt32(e.StackTrace.Substring(e.StackTrace.LastIndexOf(":line") + 5))
                'Stack trace is not available!
            Catch
            End Try
            Return linenum
        End Function
    End Module

    3 - Exemplo de uso:

        Sub Teste()
            Try
                Dim a As Integer = "sdfsd"
            Catch ex As Exception
                Dim linha As Integer = ex.LineNumber()
                Console.WriteLine(linha)
            End Try
        End Sub

    Testei aqui e funcionou perfeitamente. Espero ter ajudado.


    Herbert Lausmann

    segunda-feira, 10 de fevereiro de 2014 21:21
  • Meu projeto ja esta em Debug Full.O problema agora é que na linha

     linenum = Convert.ToInt32(e.StackTrace.Substring(e.StackTrace.LastIndexOf(":line") + 5))

     simplesmente fala que a Sequencia de entrada não estava em um formato incorreto.

    • Editado João Vitor R terça-feira, 11 de fevereiro de 2014 10:47
    terça-feira, 11 de fevereiro de 2014 10:27
  • La na aba build está configurado para Debug ou Release?

    É estranho, eu testei aqui e rodou sem problemas.


    Herbert Lausmann

    terça-feira, 11 de fevereiro de 2014 11:22
  • Saquei o que há de errado. Modifiquei aquele código para o seguinte:

    Public Module ExceptionHelper
        <System.Runtime.CompilerServices.Extension> _
        Public Function LineNumber(e As Exception) As Integer
    
            Dim linenum As Integer = 0
            Try
                linenum = Convert.ToInt32(e.StackTrace.Substring(e.StackTrace.LastIndexOf(":linha") + 6))
                'Stack trace is not available!
            Catch
            End Try
            Return linenum
        End Function
    End Module
    Veja se agora funciona...

    Herbert Lausmann

    terça-feira, 11 de fevereiro de 2014 12:52
  • Coloquei um Breakpoint e vi que a Mensagem Sequencia de entrada não estava em um formato incorreto. agora esta dando no Catch que esta vazio...!!

    Public Module ExceptionHelper
        <System.Runtime.CompilerServices.Extension> _
        Public Function LineNumber(e As Exception) As Integer
    
            Dim linenum As Integer = 0
            Try
                linenum = Convert.ToInt32(e.StackTrace.Substring(e.StackTrace.LastIndexOf(":linha") + 6))
                'Stack trace is not available!
            Catch 'Ele da o erro bem aqui (Sequencia de entrada não estava em um formato incorreto)
            End Try
            Return linenum
        End Function
    End Module

    terça-feira, 11 de fevereiro de 2014 13:08
  • Modifiquei o código novamente e testei, funcionou aqui:

    Public Module ExceptionHelper
        <System.Runtime.CompilerServices.Extension> _
        Public Function LineNumber(e As Exception) As Integer
            Dim linenum As Integer = 0
            Try
                Dim stack As String = e.StackTrace
                Dim lineIndex As Integer = stack.LastIndexOf(":linha")
                Dim lineStr As String = stack.Substring(lineIndex)
                lineStr = Split(lineStr, " ")(1)
                linenum = Integer.Parse(lineStr)
            Catch
            End Try
            Return linenum
        End Function
    End Module


    Herbert Lausmann


    • Editado Herbert Lausmann terça-feira, 11 de fevereiro de 2014 14:13
    • Marcado como Resposta João Vitor R terça-feira, 11 de fevereiro de 2014 14:30
    terça-feira, 11 de fevereiro de 2014 14:12
  • Muito obrigado depois de muita luta você matou minha duvida...Este comando mostra o "Trecho" inteiro que  o erro esta.Exemplo uma consulta ao banco de dados ou salvar um produto ele mostra a linha do cmd.ExecuteNonQuery().Isso já facilita muito.Fico agradecido e desculpa por ocupar seu tempo.

    Att. João

    terça-feira, 11 de fevereiro de 2014 14:30
  • Sem problemas amigo, fico feliz que tenha funcionado! Sua dúvida era bem interessante e creio que a nossa discussão e a solução final será bastante útil para outros colegas!!!

    Herbert Lausmann

    terça-feira, 11 de fevereiro de 2014 14:39
  • Espero que sim amigo, pois compensará a nossa grande discussão, por que vo te fala viu deu trabalho..Até mais..

    Att. João

    terça-feira, 11 de fevereiro de 2014 16:46