В блоке catch
, как я могу получить номер строки, которая выбрала исключение?
С# - получить номер строки, в которой было исключение
Ответ 1
Если вам нужен номер строки больше, чем только отформатированная трассировка стека из Exception.StackTrace, вы можете использовать StackTrace класс:
try
{
throw new Exception();
}
catch (Exception ex)
{
// Get stack trace for the exception with source file information
var st = new StackTrace(ex, true);
// Get the top stack frame
var frame = st.GetFrame(0);
// Get the line number from the stack frame
var line = frame.GetFileLineNumber();
}
Обратите внимание, что это будет работать только в том случае, если для сборки имеется файл pdb.
Ответ 2
Простой способ, используйте функцию Exception.ToString()
, он вернет строку после описания исключения.
Вы также можете проверить базу данных отладки программы, поскольку она содержит информацию об отладочной информации/журналы обо всем приложении.
Ответ 3
Если у вас нет файла .PBO
:
С#
public int GetLineNumber(Exception ex)
{
var lineNumber = 0;
const string lineSearch = ":line ";
var index = ex.StackTrace.LastIndexOf(lineSearch);
if (index != -1)
{
var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
if (int.TryParse(lineNumberText, out lineNumber))
{
}
}
return lineNumber;
}
Vb.net
Public Function GetLineNumber(ByVal ex As Exception)
Dim lineNumber As Int32 = 0
Const lineSearch As String = ":line "
Dim index = ex.StackTrace.LastIndexOf(lineSearch)
If index <> -1 Then
Dim lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length)
If Int32.TryParse(lineNumberText, lineNumber) Then
End If
End If
Return lineNumber
End Function
Или как расширения класса Exception
public static class MyExtensions
{
public static int LineNumber(this Exception ex)
{
var lineNumber = 0;
const string lineSearch = ":line ";
var index = ex.StackTrace.LastIndexOf(lineSearch);
if (index != -1)
{
var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
if (int.TryParse(lineNumberText, out lineNumber))
{
}
}
return lineNumber;
}
}
Ответ 4
Вы могли бы включить .PDB
файлы символов, связанные с сборкой, которые содержат информацию метаданных, и когда генерируется исключение, она будет содержать полную информацию в стеке, где возникло это исключение. Он будет содержать номера строк каждого метода в стеке.
Ответ 5
Работает:
var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber();
Ответ 6
Проверьте это
StackTrace st = new StackTrace(ex, true);
//Get the first stack frame
StackFrame frame = st.GetFrame(0);
//Get the file name
string fileName = frame.GetFileName();
//Get the method name
string methodName = frame.GetMethod().Name;
//Get the line number from the stack frame
int line = frame.GetFileLineNumber();
//Get the column number
int col = frame.GetFileColumnNumber();
Ответ 7
Обновить ответ
// Get stack trace for the exception with source file information
var st = new StackTrace(ex, true);
// Get the top stack frame
var frame = st.GetFrame(st.FrameCount-1);
// Get the line number from the stack frame
var line = frame.GetFileLineNumber();
Ответ 8
Метод расширения
static class ExceptionHelpers
{
public static int LineNumber(this Exception 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
{
throw new Exception("A new error happened");
}
catch (Exception ex)
{
//If error in exception LineNumber() will be -1
System.Diagnostics.Debug.WriteLine("[" + ex.LineNumber() + "] " + ex.Message);
}
Ответ 9
Я попытался использовать решение 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 ", ""));
Это работает для меня в VS2017 С#.
Ответ 10
В файле Global.resx есть событие Application_Error
он срабатывает всякий раз, когда возникает ошибка: вы можете легко получить любую информацию об ошибке и отправить ее на электронную почту с отслеживанием ошибок.
Также я думаю, что все, что вам нужно сделать, - это скомпилировать файл global.resx и добавить его dll (2 dlls) в папку bin, и это сработает!
Ответ 11
Вы также можете получить номер строки
string lineNumber=e.StackTrace.Substring(e.StackTrace.Length - 7, 7);
где e
- Exception
Ответ 12
Это работает для меня:
try
{
//your code;
}
catch(Exception ex)
{
MessageBox.Show(ex.StackTrace + " ---This is your line number, bro' :)", ex.Message);
}