예외가 발생한 줄 번호는 어떻게 알 수 있습니까?


198

A의 catch블록, 어떻게 예외를 던져 줄 번호를받을 수 있나요?


런타임에는 소스 코드가 없습니다. 이 라인은 무엇에 사용되지 않습니까? 디버그시 IDE는 예외를 던지는 줄을 명확하게 보여줍니다.
ankitjaininfo



IDE가 없으면 @ankitjaininfo 도움이되지 않습니다!
Michael

이것이 귀하의 질문에 대답합니까? 예외 처리시 줄 번호 표시
Liam

답변:


281

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
바로 창에서 VB 한 줄에 대한? (New StackTrace (ex, True)). GetFrame (0) .GetFileLineNumber ().
Jonathan

34
C # one liner :int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
gunwin

17
이것은 항상 0을 반환합니다. pdb 파일이 없기 때문에 발생합니까? 그것은 무엇이며 어떻게 얻는가? (필자는 ASP.net을 사용하고 있습니다)
Brabbeldas

17
왜 GetFrame (0)을 사용하고 있습니까? GetFrame (FrameCount-1)을 사용해야한다고 생각합니다.
Dewald Swanepoel

9
@DewaldSwanepoel의 제안 GetFrame(st.FrameCount-1)이 훨씬 신뢰할 수 있음을 발견했습니다 .
Brad Martin

75

간단한 방법으로 Exception.ToString()함수를 사용 하면 예외 설명 후에 줄을 반환합니다.

전체 응용 프로그램에 대한 디버그 정보 / 로그가 포함 된 프로그램 디버그 데이터베이스를 확인할 수도 있습니다.


MSDN은 "현재 예외의 문자열 표현을 생성하고 반환합니다"라고 다르게 생각합니다. msdn.microsoft.com/en-us/library/…
Prokurors

다음과 비슷한 것을 얻습니다.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와 동일한 정보를 얻을 수 없는지 궁금했습니다.
Matthis Kohli

3
이 답변에 더 많은 투표가 없다는 것은 미친 일입니다. 이것은 간단하고 안정적으로 작동하며 PDB 경고와 함께 제공되지 않습니다.
Nick Painter

9
Exception.Message나 한테 죽었어 다시는
복원 Monica Monica Cellio

27

.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;
    }
}   

8
불행히도 영어가 아닌 OS에서는 작동하지 않습니다 ( "line"단어는 로케일에 따라 다릅니다).
Ivan Kochurkin

2
@KvanTTT 같은 효과 Regex.Match:[^ ]+ (\d+)위해 사용할 수 있습니다 .
Dan Bechard

ex.StackTrace에는 :line PDB 파일이 없으므로이 대답은 효과가 없습니다 .
Warlike Chimpanzee

18

당신은 포함 할 수 .PDB메타 데이터 정보를 포함하고 예외가 발생 될 때이 예외가 발생한 위치의 스택 트레이스 전체 정보가 포함됩니다 어셈블리에 관련된 기호 파일을. 스택에있는 각 메소드의 행 번호를 포함합니다.


PDB를 포함시키는 방법은 무엇입니까? PDB를 응용 프로그램에 번들로 묶거나 GAC에 등록하는 방법이 있습니까?
Jacob Persi


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();

1

답변으로 업데이트

    // 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();

1

@ 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 C #에서 저에게 효과적입니다.


0

확장 방법

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);
}

0

나를 위해 일하는 :

var st = new StackTrace(e, true);

// Get the bottom stack frame
var frame = st.GetFrame(st.FrameCount - 1);
// Get the line number from the stack frame
var line = frame.GetFileLineNumber();
var method = frame.GetMethod().ReflectedType.FullName;
var path = frame.GetFileName();

0

행, 열, 메서드, 파일 이름 및 메시지를 반환하는 Exception에 확장을 추가했습니다.

public static class Extensions
{
    public static string ExceptionInfo(this Exception exception)
    {

        StackFrame stackFrame = (new StackTrace(exception, true)).GetFrame(0);
        return string.Format("At line {0} column {1} in {2}: {3} {4}{3}{5}  ",
           stackFrame.GetFileLineNumber(), stackFrame.GetFileColumnNumber(),
           stackFrame.GetMethod(), Environment.NewLine, stackFrame.GetFileName(),
           exception.Message);

    }
}

-3

Global.resx 파일에는 Application_Error라는 이벤트가 있습니다.

오류가 발생할 때마다 발생하며 오류에 대한 정보를 쉽게 얻을 수 있으며 버그 추적 전자 메일로 보낼 수 있습니다.

또한 u 가해 야 할 일은 global.resx를 컴파일하고 해당 dll (2 dll)을 bin 폴더에 추가하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.