2009-06-29 3 views
6

dotNet에서 한 라인에서 예외가 발생하여 잡히면 어떤 파일의 어떤 라인에서 예외가 발생했는지를 어떻게 알 수 있습니까? 상대적으로 직선적 인 것으로 보이지만 나는 그것을 이해할 수 없습니다 ...어떤 코드 라인에서 예외가 발생했는지 판단

답변

6

사용 가능한 디버그 기호가있는 경우에만 수행 할 수 있습니다.

catch(Exception ex) { 
    // check the ex.StackTrace property 
} 

당신은 VS에서 이러한 상황을 디버깅 할 경우

, 당신은 더 나은 단지 Debug 메뉴에있는 Exceptions 대화 상자에서 Common Language Runtime Exceptions에 대한 Thrown 체크 박스에 체크 것입니다. 디버거는 try 블록에 있어도 예외가 발생하는 즉시 중단됩니다. FirstChanceException라고 무슨 당신이 가진 .NET에서,

try 
{ 
    ... 
    ... 

} 
catch(...) 
{ 
    StackFrame sf = new StackFrame(true); 

    int lineNumber = sf.GetFileLineNumber(); 
    int colNumber = sf.GetFileColumnNumber(); 
    string fileName = sf.GetFileName(); 
    string methodName = sf.GetMethod().Name; 
} 
+0

정답입니다. – Timwi

1

당신은 StackFrame Class을 사용할 수 있습니다. 이것은 본질적으로 예외가 처리되기 전에 발생합니다. 여기에 제시하는 문제를 보는 두 가지 방법이 있습니다. 하나는 디버깅 각도에서 나온 것입니다. 디버깅을하는 경우 Debug/Exceptions 윈도우에서 던져진 예외를 catch하도록 디버거를 설정할 수 있습니다. 이것은 대화 형 환경에서 더 쉽습니다. 당신은 대화 형이 아닌 컨텍스트 내에서이 정보를 기록해야하는 경우 CMS에 대해 얘기 무엇 그때

try 
{ 
    ... 
} 
catch(Exception ex) 
{ 
    System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(ex); 
    System.Diagnostics.StackFrame firstFrame = stackTrace.GetFrame[0]; 
    Console.WriteLine(firstFrame.GetFileLineNumber); 
    ... 
} 

여기 유일한 차이는 우리가 다음, 전체 스택 추적 얻을 수 있다는 것입니다 ... 비슷한 할 것 처음 예외가 던져진 첫 번째 프레임으로 이동하십시오.

+4

그러나 'catch'절에 대한 정보를 반환한다는 점에 유의하십시오. 예외가 발생한 곳이 아닌데, 잡은 예외의 'StackTrace'속성의 내용을 확인해야합니다. – jerryjvl

+0

jerryjvl이 말한 이유 때문에이 답변이 잘못되었습니다. 어떻게 이것이 옳은 것으로 받아 들여질 수 있습니까? – Timwi

1

음 :

+0

프레임 0이 프레임의 현재 방법이 아니고 오류가 발생한 곳이 아닙니까? –

2

개인적으로 나는 예외의 ToString() 반환 값을 기록합니다. 전체 스택 추적이 포함됩니다. 그것은 코드의 한 줄입니다 ... 죽은 단순한.

관련 문제