Dalam sebuah catchblok, bagaimana saya bisa mendapatkan nomor baris yang melempar pengecualian?
Dalam sebuah catchblok, bagaimana saya bisa mendapatkan nomor baris yang melempar pengecualian?
Jawaban:
Jika Anda membutuhkan nomor baris untuk lebih dari sekadar jejak tumpukan yang diformat yang Anda dapatkan dari Exception.StackTrace, Anda bisa menggunakan kelas 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();
}
Perhatikan bahwa ini hanya akan berfungsi jika ada file pdb tersedia untuk majelis.
int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
GetFrame(st.FrameCount-1)agar jauh lebih andal.
Cara sederhana, gunakan Exception.ToString()fungsi, itu akan mengembalikan garis setelah deskripsi pengecualian.
Anda juga dapat memeriksa database debug program karena berisi info debug / log tentang seluruh aplikasi.
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.Messagesudah mati bagiku. Tidak akan lagi.
Jika Anda tidak memiliki .PBOfile:
C #
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
Atau sebagai perluasan pada kelas 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.Matchdengan :[^ ]+ (\d+)untuk efek yang sama.
:line dan saya tidak memiliki file PDB.
Anda bisa menyertakan .PDBfile simbol yang terkait dengan majelis yang berisi informasi metadata dan ketika pengecualian dilemparkan itu akan berisi informasi lengkap di stacktrace dari mana pengecualian ini berasal. Ini akan berisi nomor baris setiap metode dalam tumpukan.
Berhasil:
var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber();
UnhandledExceptionEventArgsobjek
Periksa ini
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();
Perbarui ke jawabannya
// 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();
Saya mencoba menggunakan solusi By @ davy-c tetapi memiliki Pengecualian "System.FormatException: 'String input tidak dalam format yang benar.'", Ini karena masih ada teks yang melewati nomor baris, saya memodifikasi kode diposting dan muncul dengan:
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 ", ""));
Ini bekerja untuk saya di 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);
}
Bekerja untuk saya:
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();
Saya menambahkan ekstensi ke Pengecualian yang mengembalikan baris, kolom, metode, nama file, dan pesan:
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);
}
}
Dalam file Global.resx ada acara yang disebut Application_Error
itu menyala setiap kali terjadi kesalahan, Anda dapat dengan mudah mendapatkan informasi tentang kesalahan, dan mengirimkannya ke email pelacakan bug.
Juga saya pikir semua yang perlu Anda lakukan adalah mengkompilasi global.resx dan menambahkan dll (2 dll) ke folder bin Anda dan itu akan bekerja!