คำตอบอื่น ๆ นั้นถูกต้องทั้งหมด แต่คำตอบนี้ให้ส่วนที่เป็นพิเศษเพิ่มเติมฉันคิดว่า
ลองพิจารณาตัวอย่างนี้:
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;
บรรทัดเอาท์พุทของคุณคือ:
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.
แน่นอนคุณได้สูญเสียข้อมูลเกี่ยวกับข้อยกเว้นที่เกิดขึ้น หากคุณใช้throw;
สายแทนนี่คือสิ่งที่คุณจะได้รับ:
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.
มันดีกว่ามากเพราะตอนนี้คุณเห็นแล้วว่ามันเป็นProgram.Div
วิธีการที่ทำให้คุณเกิดปัญหา แต่ก็ยังยากที่จะดูว่าปัญหานี้มาจากบรรทัดที่ 35 หรือบรรทัดที่ 37 ในtry
บล็อก
หากคุณใช้ทางเลือกที่สามห่อด้วยข้อยกเว้นภายนอกคุณจะไม่สูญเสียข้อมูลใด ๆ :
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
โดยเฉพาะอย่างยิ่งคุณจะเห็นว่ามันเป็นบรรทัดที่ 35ที่นำไปสู่ปัญหา อย่างไรก็ตามสิ่งนี้ต้องการผู้คนในการค้นหาInnerException
และรู้สึกค่อนข้างทางอ้อมในการใช้ข้อยกเว้นภายในในกรณีง่าย ๆ
ในการโพสต์บล็อกนี้พวกเขารักษาหมายเลขบรรทัด (สายของลองบล็อก) โดยการเรียก (ผ่านการสะท้อน) internal
วิธีการแสดงเจตนาInternalPreserveStackTrace()
ในException
วัตถุ แต่ก็ไม่ดีที่จะใช้การสะท้อนเช่นนั้น (. NET Framework อาจเปลี่ยนinternal
สมาชิกของพวกเขาบางวันโดยไม่มีการเตือน)