во время выполнения нет исходного кода. для чего эта строка не будет использоваться? во время отладки среда IDE четко показывает строку, которая выдает исключение.
Если вам нужен номер строки не только для отформатированной трассировки стека, которую вы получаете из Exception.StackTrace, вы можете использовать класс 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();}
Обратите внимание, что это будет работать только при наличии файла pdb для сборки.
Вы получаете что-то похожее на:System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
Профессор программирования
3
Это должен быть принятый ответ. Я всегда обращался к ex.message и удивлялся, почему тупой VB.net не может получить ту же информацию, что и в Java.
Маттис Кохли
3
Это безумие, что этот ответ не имеет больше голосов. Это просто, работает надежно и не сопровождается оговорками PDB.
К сожалению, не будет работать в неанглийской ОС (слово "line" зависит от локали).
Иван Кочуркин
2
@KvanTTT Вы можете использовать Regex.Matchс :[^ ]+ (\d+)тем же эффектом.
Дэн
Этот ответ не работает для меня, так как ex.StackTrace не имеет, :line и у меня нет файла PDB.
Воинственный шимпанзе
18
Вы могли бы включить .PDBфайлы символов, связанные со сборкой, которые содержат информацию метаданных, и когда выдается исключение, оно будет содержать полную информацию в трассировке стека о том, где это исключение возникло. Он будет содержать номера строк каждого метода в стеке.
Как насчет необработанных исключений? как UnhandledExceptionEventArgsобъект
Юша Алеауб
6
Проверьте это
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();
Я попытался использовать решение By @ davy-c, но было исключение «System.FormatException:« Строка ввода была не в правильном формате. »», Это было связано с тем, что после номера строки по-прежнему оставался текст, я изменил код, который он разместил и придумал:
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;}}
использование
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();
В файле Global.resx есть событие Application_Error
Он срабатывает при возникновении ошибки. Вы можете легко получить любую информацию об ошибке и отправить ее на электронную почту для отслеживания ошибок.
Также я думаю, что все, что вам нужно сделать, это скомпилировать global.resx и добавить его dll (2 dll) в папку bin, и это будет работать!
Ответы:
Если вам нужен номер строки не только для отформатированной трассировки стека, которую вы получаете из Exception.StackTrace, вы можете использовать класс StackTrace :
Обратите внимание, что это будет работать только при наличии файла pdb для сборки.
источник
int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
GetFrame(st.FrameCount-1)
намного надежнее.Проще говоря, используйте
Exception.ToString()
функцию, она вернет строку после описания исключения.Вы также можете проверить базу данных отладки программы, так как она содержит отладочную информацию / журналы обо всем приложении.
источник
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
мертв для меня. Никогда больше.Если у вас нет
.PBO
файла:C #
Vb.net
Или как расширения класса Exception
источник
Regex.Match
с:[^ ]+ (\d+)
тем же эффектом.:line
и у меня нет файла PDB.Вы могли бы включить
.PDB
файлы символов, связанные со сборкой, которые содержат информацию метаданных, и когда выдается исключение, оно будет содержать полную информацию в трассировке стека о том, где это исключение возникло. Он будет содержать номера строк каждого метода в стеке.источник
Оно работает:
источник
UnhandledExceptionEventArgs
объектПроверьте это
источник
Обновление до ответа
источник
Я попытался использовать решение By @ davy-c, но было исключение «System.FormatException:« Строка ввода была не в правильном формате. »», Это было связано с тем, что после номера строки по-прежнему оставался текст, я изменил код, который он разместил и придумал:
Это работает для меня в VS2017 C #.
источник
Метод расширения
использование
источник
Работая на меня:
источник
Я добавил расширение Exception, которое возвращает строку, столбец, метод, имя файла и сообщение:
источник
В файле Global.resx есть событие Application_Error
Он срабатывает при возникновении ошибки. Вы можете легко получить любую информацию об ошибке и отправить ее на электронную почту для отслеживания ошибок.
Также я думаю, что все, что вам нужно сделать, это скомпилировать global.resx и добавить его dll (2 dll) в папку bin, и это будет работать!
источник