A의 catch
블록, 어떻게 예외를 던져 줄 번호를받을 수 있나요?
A의 catch
블록, 어떻게 예외를 던져 줄 번호를받을 수 있나요?
답변:
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 파일이있는 경우에만 작동합니다.
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
파일 이없는 경우 :
씨#
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;
}
}
Regex.Match
를 :[^ ]+ (\d+)
위해 사용할 수 있습니다 .
:line
PDB 파일이 없으므로이 대답은 효과가 없습니다 .
당신은 포함 할 수 .PDB
메타 데이터 정보를 포함하고 예외가 발생 될 때이 예외가 발생한 위치의 스택 트레이스 전체 정보가 포함됩니다 어셈블리에 관련된 기호 파일을. 스택에있는 각 메소드의 행 번호를 포함합니다.
효과가있다:
var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber();
UnhandledExceptionEventArgs
개체
이것 좀 봐
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();
@ 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 #에서 저에게 효과적입니다.
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);
}
나를 위해 일하는 :
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();
행, 열, 메서드, 파일 이름 및 메시지를 반환하는 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);
}
}