С# - получить номер строки, в которой было исключение

В блоке 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);
}