ในcatch
บล็อกฉันจะรับหมายเลขบรรทัดที่แสดงข้อยกเว้นได้อย่างไร
ใน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
หรือเป็นขอบเขตในคลาสข้อยกเว้น
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();
อัปเดตเป็นคำตอบ
// 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();
ฉันลองใช้วิธีแก้ปัญหาโดย @ 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();
ฉันเพิ่มส่วนขยายในข้อยกเว้นซึ่งส่งคืนบรรทัดคอลัมน์วิธีชื่อไฟล์และข้อความ:
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);
}
}
ในไฟล์ Global.resx มีเหตุการณ์ชื่อ Application_Error
มันจะยิงเมื่อมีข้อผิดพลาดเกิดขึ้นคุณสามารถรับข้อมูลเกี่ยวกับข้อผิดพลาดได้อย่างง่ายดายและส่งไปยังอีเมลติดตามข้อผิดพลาด
นอกจากนี้ฉันคิดว่าทุกสิ่งที่คุณต้องทำคือการรวบรวม global.resx และเพิ่ม dll ของมัน (2 ที่กำลัง) ไปยังโฟลเดอร์ถังขยะของคุณและมันจะทำงาน!