em tempo de execução, não há código fonte. Para que essa linha não será usada? no momento da depuração, o IDE mostra claramente a linha que gera uma exceção.
Se você precisar do número da linha para mais do que apenas o rastreamento de pilha formatado obtido de Exception.StackTrace, poderá usar a classe StackTrace :
try{thrownewException();}catch(Exception ex){// Get stack trace for the exception with source file informationvar st =newStackTrace(ex,true);// Get the top stack framevar frame = st.GetFrame(0);// Get the line number from the stack framevar line = frame.GetFileLineNumber();}
Observe que isso só funcionará se houver um arquivo pdb disponível para o assembly.
Você obtém algo semelhante a:System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
Professor de programação
3
Essa deve ser a resposta aceita. Eu sempre fui ao ex.message e me perguntei por que o estúpido VB.net não é capaz de obter as mesmas informações que em Java.
Matthis Kohli
3
É uma loucura que essa resposta não tenha mais votos positivos. Isso é simples, funciona de maneira confiável e não vem com as advertências do PDB.
Infelizmente, não funcionará no sistema operacional não inglês (a palavra "linha" depende da localidade).
Ivan Kochurkin
2
@KvanTTT Você pode usar Regex.Matchcom :[^ ]+ (\d+)o mesmo efeito.
precisa
Esta resposta não funciona para mim, pois o ex.StackTrace não tem :line e eu não tenho o arquivo PDB.
Chimpanzé guerreiro
18
Você pode incluir .PDBarquivos de símbolos associados à montagem que contêm informações de metadados e, quando uma exceção é lançada, ela contém informações completas no rastreamento de pilha de onde essa exceção se originou. Ele conterá os números de linha de cada método na pilha.
E as exceções não tratadas? como UnhandledExceptionEventArgsobjeto
Yousha Aleayoub 20/11/19
6
Confira este
StackTrace st =newStackTrace(ex,true);//Get the first stack frameStackFrame frame = st.GetFrame(0);//Get the file namestring fileName = frame.GetFileName();//Get the method namestring methodName = frame.GetMethod().Name;//Get the line number from the stack frameint line = frame.GetFileLineNumber();//Get the column numberint col = frame.GetFileColumnNumber();
// Get stack trace for the exception with source file informationvar st =newStackTrace(ex,true);// Get the top stack framevar frame = st.GetFrame(st.FrameCount-1);// Get the line number from the stack framevar line = frame.GetFileLineNumber();
Tentei usar a solução By @ davy-c, mas tinha uma exceção "System.FormatException: 'String de entrada não estava no formato correto.'", Isso ocorreu porque ainda havia texto após o número da linha, modifiquei o código postou e veio com:
int line =Convert.ToInt32(objErr.ToString().Substring(objErr.ToString().IndexOf("line")).Substring(0, objErr.ToString().Substring(objErr.ToString().IndexOf("line")).ToString().IndexOf("\r\n")).Replace("line ",""));
staticclassExceptionHelpers{publicstaticintLineNumber(thisException ex){int n;int i = ex.StackTrace.LastIndexOf(" ");if(i >-1){string s = ex.StackTrace.Substring(i +1);if(int.TryParse(s,out n))return n;}return-1;}}
Uso
try{thrownewException("A new error happened");}catch(Exception ex){//If error in exception LineNumber() will be -1System.Diagnostics.Debug.WriteLine("["+ ex.LineNumber()+"] "+ ex.Message);}
var st =newStackTrace(e,true);// Get the bottom stack framevar frame = st.GetFrame(st.FrameCount-1);// Get the line number from the stack framevar line = frame.GetFileLineNumber();var method = frame.GetMethod().ReflectedType.FullName;var path = frame.GetFileName();
No arquivo Global.resx, há um evento chamado Application_Error
ele é acionado sempre que ocorre um erro, você pode facilmente obter qualquer informação sobre o erro e enviá-lo para um e-mail de rastreamento de bug.
Também acho que tudo o que você precisa fazer é compilar o global.resx e adicionar suas DLLs (2 DLLs) à sua pasta bin e ele funcionará!
Respostas:
Se você precisar do número da linha para mais do que apenas o rastreamento de pilha formatado obtido de Exception.StackTrace, poderá usar a classe StackTrace :
Observe que isso só funcionará se houver um arquivo pdb disponível para o assembly.
fonte
int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
GetFrame(st.FrameCount-1)
muito mais confiável.De maneira simples, use a
Exception.ToString()
função, ela retornará a linha após a descrição da exceção.Você também pode verificar o banco de dados de depuração do programa, pois ele contém informações / logs de depuração sobre todo o aplicativo.
fonte
System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
Exception.Message
está morto para mim. Nunca mais.Se você não possui o
.PBO
arquivo:C #
Vb.net
Ou como uma extensão na classe Exception
fonte
Regex.Match
com:[^ ]+ (\d+)
o mesmo efeito.:line
e eu não tenho o arquivo PDB.Você pode incluir
.PDB
arquivos de símbolos associados à montagem que contêm informações de metadados e, quando uma exceção é lançada, ela contém informações completas no rastreamento de pilha de onde essa exceção se originou. Ele conterá os números de linha de cada método na pilha.fonte
Funciona:
fonte
UnhandledExceptionEventArgs
objetoConfira este
fonte
Atualize para a resposta
fonte
Tentei usar a solução By @ davy-c, mas tinha uma exceção "System.FormatException: 'String de entrada não estava no formato correto.'", Isso ocorreu porque ainda havia texto após o número da linha, modifiquei o código postou e veio com:
Isso funciona para mim no VS2017 C #.
fonte
Método de Extensão
Uso
fonte
Trabalhando para mim:
fonte
Eu adicionei uma extensão ao Exception que retorna a linha, coluna, método, nome do arquivo e mensagem:
fonte
No arquivo Global.resx, há um evento chamado Application_Error
ele é acionado sempre que ocorre um erro, você pode facilmente obter qualquer informação sobre o erro e enviá-lo para um e-mail de rastreamento de bug.
Também acho que tudo o que você precisa fazer é compilar o global.resx e adicionar suas DLLs (2 DLLs) à sua pasta bin e ele funcionará!
fonte