OK
Published on

Geliştirdiğim yazılımın fırlattığı hataların kaynağına nasıl erişebilirim?

Authors
  • avatar
    Name
    Oğuzhan Kırçalı
    Twitter

Büyük bir yazılım projesi hayal edin. Onlarca sınıf ve yüzlerce metot… Bu kalabalıkta hataları yakalamak kolay olsa da hatayı kimin yaptığını bulmak biraz zor oluyor. İç içe onlarca metot çağrısından sıyrılarak hatanın tam olarak hangi sınıfın hangi metodunun hangi satırından kaynaklandığını Stack Trace aracılığı ile bulmak, bu zorluğu oldukça kolaylaştırdı benim için.

MVC projesinin Global.asax dosyasındaki Application_Error metodunda hatayı yakalıyorum. Burada dikkat edilmesi gereken nokta, try-catch bloğu kullanılan metotlardaki hatalar Global.asax’daki bu metoda düşmez. O zaman herkes kendi catch’ini yönetecek demektir.

Benim senaryomda Global.asax dosyasından yazıyor olsam da Exception’ı yakaladığınız her yerde bu metodu çağırarak sonuca erişebilirsiniz.

protected void Application_Error(object sender, EventArgs e)
{
    var ex = Server.GetLastError();
    string allFootprints = GetAllFootprints(ex);
}

Hatayı yakaladıktan sonra aşağıdaki metoda gönderiyoruz.

public static string GetAllFootprints(Exception x)
{
    var st = new StackTrace(x, true);
    var frames = st.GetFrames();
    var traceString = "";
    foreach (var frame in frames)
    {
        if (frame.GetFileLineNumber() < 1)
            continue;

        traceString +=
        "File: " + frame.GetFileName() +
        ", Method:" + frame.GetMethod().Name +
        ", LineNumber: " + frame.GetFileLineNumber();
        traceString += " –> ";
    }
    return traceString;
}

Koddan da anlayacağınız üzere, bu metot bize şöyle bir metin dönecektir.

File: c:\MyProject\Program.cs, Method:MyFunction, LineNumber: 29File: c:\MyProject\Program.cs, Method:Main, LineNumber: 16

stackoverflow.com/exception-footprints