Diğer cevaplar tamamen doğru, ama bu cevap bazı ekstra detaliler sağlıyor, sanırım.
Bu örneği düşünün:
using System;
static class Program {
static void Main() {
try {
ThrowTest();
} catch (Exception e) {
Console.WriteLine("Your stack trace:");
Console.WriteLine(e.StackTrace);
Console.WriteLine();
if (e.InnerException == null) {
Console.WriteLine("No inner exception.");
} else {
Console.WriteLine("Stack trace of your inner exception:");
Console.WriteLine(e.InnerException.StackTrace);
}
}
}
static void ThrowTest() {
decimal a = 1m;
decimal b = 0m;
try {
Mult(a, b); // line 34
Div(a, b); // line 35
Mult(b, a); // line 36
Div(b, a); // line 37
} catch (ArithmeticException arithExc) {
Console.WriteLine("Handling a {0}.", arithExc.GetType().Name);
// uncomment EITHER
//throw arithExc;
// OR
//throw;
// OR
//throw new Exception("We handled and wrapped your exception", arithExc);
}
}
static void Mult(decimal x, decimal y) {
decimal.Multiply(x, y);
}
static void Div(decimal x, decimal y) {
decimal.Divide(x, y);
}
}
throw arithExc;
Çizgiyi kaldırırsanız, çıktınız:
Handling a DivideByZeroException.
Your stack trace:
at Program.ThrowTest() in c:\somepath\Program.cs:line 44
at Program.Main() in c:\somepath\Program.cs:line 9
No inner exception.
Elbette, bu istisnanın nerede olduğu hakkında bilgi kaybettiniz. Bunun yerine throw;
satırı kullanırsanız, elde ettiğiniz şey budur:
Handling a DivideByZeroException.
Your stack trace:
at System.Decimal.FCallDivide(Decimal& d1, Decimal& d2)
at System.Decimal.Divide(Decimal d1, Decimal d2)
at Program.Div(Decimal x, Decimal y) in c:\somepath\Program.cs:line 58
at Program.ThrowTest() in c:\somepath\Program.cs:line 46
at Program.Main() in c:\somepath\Program.cs:line 9
No inner exception.
Bu çok daha iyi, çünkü şimdi Program.Div
size sorunlara neden olan yöntem olduğunu görüyorsunuz. Ancak bu sorunun try
bloktaki 35. satırdan mı yoksa 37. satırdan mı kaynaklandığını görmek hala zor .
Dış bir istisnayı içine alarak üçüncü alternatifi kullanırsanız hiçbir bilgi kaybetmezsiniz:
Handling a DivideByZeroException.
Your stack trace:
at Program.ThrowTest() in c:\somepath\Program.cs:line 48
at Program.Main() in c:\somepath\Program.cs:line 9
Stack trace of your inner exception:
at System.Decimal.FCallDivide(Decimal& d1, Decimal& d2)
at System.Decimal.Divide(Decimal d1, Decimal d2)
at Program.Div(Decimal x, Decimal y) in c:\somepath\Program.cs:line 58
at Program.ThrowTest() in c:\somepath\Program.cs:line 35
Özellikle , soruna yol açan 35. satır olduğunu görebilirsiniz . Bununla birlikte, bu, insanların arama yapmasını gerektirir InnerException
ve basit durumlarda iç istisnaları kullanmak biraz dolaylı hisseder.
Gelen bu blog yayınında onlar (yansıma yoluyla) arayarak hat numarasını (try'ın hattı) korumak internal
intance yöntemi InternalPreserveStackTrace()
üzerinde Exception
nesne. Ancak böyle bir yansıma kullanmak hoş değil (.NET Framework, internal
üyelerini uyarı yapmadan bir gün değiştirebilir ).