Bir catch
blokta, istisna atan satır numarasını nasıl alabilirim?
Bir catch
blokta, istisna atan satır numarasını nasıl alabilirim?
Yanıtlar:
Satır numarasına Exception.StackTrace'ten aldığınız biçimlendirilmiş yığın izlemesinden daha fazlası için ihtiyacınız varsa, StackTrace sınıfını kullanabilirsiniz :
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();
}
Bunun yalnızca montaj için bir pdb dosyası varsa işe yarayacağını unutmayın.
int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
GetFrame(st.FrameCount-1)
çok daha güvenilir olmak için kullanarak öneri bulundu .
Basit bir şekilde, Exception.ToString()
işlevi kullanın , istisna açıklamasından sonra satırı döndürecektir.
Ayrıca tüm uygulama hakkında hata ayıklama bilgileri / günlükleri içerdiğinden program hata ayıklama veritabanını da kontrol edebilirsiniz.
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
benim için öldü. Bir daha asla.
.PBO
Dosyanız yoksa :
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
Veya İstisna sınıfının bir uzantısı olarak
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
ile :[^ ]+ (\d+)
aynı etki için.
:line
ve PDB dosyası yok.
Sen içerebilir .PDB
meta bilgileri içerir ve bir özel durum olduğunda bu istisna kökenli nerede stacktrace tam bilgileri içerir montaja ilişkili simge dosyalarını. Yığındaki her yöntemin satır numaralarını içerecektir.
İşe yarıyor:
var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber();
UnhandledExceptionEventArgs
nesne
Bunu kontrol et
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();
Cevaba güncelleme
// 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();
By @ davy-c çözümünü kullanmayı denedim ama "System.FormatException: 'Giriş dizesi doğru biçimde değildi." Bir istisnası vardı. yayınladı ve ile geldi:
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 ", ""));
Bu VS2017 C # benim için çalışıyor.
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);
}
Benim için çalışmak:
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();
Satır, sütun, yöntem, dosya adı ve iletiyi döndüren Exception'a bir uzantı ekledim:
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 dosyasında Application_Error adlı bir olay var
bir hata oluştuğunda patlar, hata hakkında kolayca bilgi alabilir ve hata izleme e-postasına gönderebilirsiniz.
Ayrıca tüm u yapmanız gereken global.resx derlemek ve bin klasörünüze dll's (2 dlls) eklemek olduğunu düşünüyorum ve işe yarayacak!