saat runtime tidak ada kode sumber. untuk apa baris ini tidak akan digunakan? pada waktu debug, IDE dengan jelas menunjukkan baris yang melempar pengecualian.
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{thrownewException();}catch(Exception ex){// Get stack trace for the exception with source file informationvar st =newStackTrace(ex,true);// Get the top stack framevar frame = st.GetFrame(0);// Get the line number from the stack framevar line = frame.GetFileLineNumber();}
Perhatikan bahwa ini hanya akan berfungsi jika ada file pdb tersedia untuk majelis.
? (New StackTrace (ex, True)). GetFrame (0) .GetFileLineNumber () untuk baris tunggal VB dari jendela langsung.
Jonathan
34
C # one liner:int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
gunwin
17
Ini selalu mengembalikan 0 untuk saya. Apakah ini disebabkan oleh tidak memiliki file pdb? Apa itu dan bagaimana cara mendapatkannya? (Saya menggunakan ASP.net)
Brabbeldas
17
Mengapa Anda menggunakan GetFrame (0)? Saya akan berpikir bahwa Anda harus menggunakan GetFrame (FrameCount-1).
Dewald Swanepoel
9
Saya telah menemukan saran @DewaldSwanepoel untuk menggunakan GetFrame(st.FrameCount-1)agar jauh lebih andal.
Brad Martin
75
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.
Yah MSDN berpikir berbeda, bahwa itu "Membuat dan mengembalikan representasi string dari pengecualian saat ini": msdn.microsoft.com/en-us/library/…
Prokurors
Anda mendapatkan sesuatu yang mirip dengan:System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
Profesor pemrograman
3
Ini harus menjadi jawaban yang diterima. Saya selalu pergi untuk ex.message dan bertanya-tanya mengapa VB.net bodoh tidak bisa mendapatkan informasi yang sama seperti di Jawa.
Matthis Kohli
3
Gila bahwa jawaban ini tidak memiliki lebih banyak suara positif. Ini sederhana, dapat diandalkan, dan tidak disertai dengan peringatan PDB.
Nick Painter
9
Exception.Messagesudah mati bagiku. Tidak akan lagi.
Sayangnya tidak akan berfungsi dalam OS bukan bahasa Inggris (kata "line" tergantung pada lokal).
Ivan Kochurkin
2
@KvanTTT Anda dapat menggunakan Regex.Matchdengan :[^ ]+ (\d+)untuk efek yang sama.
Dan Bechard
Jawaban ini tidak berfungsi untuk saya, karena ex.StackTrace tidak memiliki :line dan saya tidak memiliki file PDB.
Simpanse suka berperang
18
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.
Bagaimana dengan pengecualian yang tidak ditangani? seperti UnhandledExceptionEventArgsobjek
Yousha Aleayoub
6
Periksa ini
StackTrace st =newStackTrace(ex,true);//Get the first stack frameStackFrame frame = st.GetFrame(0);//Get the file namestring fileName = frame.GetFileName();//Get the method namestring methodName = frame.GetMethod().Name;//Get the line number from the stack frameint line = frame.GetFileLineNumber();//Get the column numberint col = frame.GetFileColumnNumber();
// Get stack trace for the exception with source file informationvar st =newStackTrace(ex,true);// Get the top stack framevar frame = st.GetFrame(st.FrameCount-1);// Get the line number from the stack framevar 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 ",""));
staticclassExceptionHelpers{publicstaticintLineNumber(thisException 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;}}
Pemakaian
try{thrownewException("A new error happened");}catch(Exception ex){//If error in exception LineNumber() will be -1System.Diagnostics.Debug.WriteLine("["+ ex.LineNumber()+"] "+ ex.Message);}
var st =newStackTrace(e,true);// Get the bottom stack framevar frame = st.GetFrame(st.FrameCount-1);// Get the line number from the stack framevar line = frame.GetFileLineNumber();var method = frame.GetMethod().ReflectedType.FullName;var path = frame.GetFileName();
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 :
Perhatikan bahwa ini hanya akan berfungsi jika ada file pdb tersedia untuk majelis.
sumber
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.
sumber
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
sudah mati bagiku. Tidak akan lagi.Jika Anda tidak memiliki
.PBO
file:C #
Vb.net
Atau sebagai perluasan pada kelas Exception
sumber
Regex.Match
dengan:[^ ]+ (\d+)
untuk efek yang sama.:line
dan saya tidak memiliki file PDB.Anda bisa menyertakan
.PDB
file 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.sumber
Berhasil:
sumber
UnhandledExceptionEventArgs
objekPeriksa ini
sumber
Perbarui ke jawabannya
sumber
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:
Ini bekerja untuk saya di VS2017 C #.
sumber
Metode Perpanjangan
Pemakaian
sumber
Bekerja untuk saya:
sumber
Saya menambahkan ekstensi ke Pengecualian yang mengembalikan baris, kolom, metode, nama file, dan pesan:
sumber
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!
sumber