ไม่มีใครอธิบายความแตกต่างระหว่างExceptionDispatchInfo.Capture( ex ).Throw()
และธรรมดาthrow
ดังนั้นนี่คือ
วิธีที่สมบูรณ์ในการสร้างข้อยกเว้นที่ถูกดักจับใหม่คือการใช้ExceptionDispatchInfo.Capture( ex ).Throw()
(ใช้ได้เฉพาะจาก. Net 4.5)
ด้านล่างมีกรณีที่จำเป็นในการทดสอบนี้:
1
void CallingMethod()
{
//try
{
throw new Exception( "TEST" );
}
//catch
{
// throw;
}
}
2
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch( Exception ex )
{
ExceptionDispatchInfo.Capture( ex ).Throw();
throw; // So the compiler doesn't complain about methods which don't either return or throw.
}
}
3
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch
{
throw;
}
}
4
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch( Exception ex )
{
throw new Exception( "RETHROW", ex );
}
}
กรณีที่ 1 และกรณีที่ 2 จะให้การติดตามสแต็กแก่คุณโดยที่หมายเลขบรรทัดซอร์สโค้ดสำหรับCallingMethod
วิธีคือหมายเลขบรรทัดของthrow new Exception( "TEST" )
บรรทัด
อย่างไรก็ตามกรณีที่ 3 จะให้การติดตามสแต็กแก่คุณโดยที่หมายเลขบรรทัดซอร์สโค้ดสำหรับCallingMethod
วิธีคือหมายเลขบรรทัดของการthrow
โทร ซึ่งหมายความว่าหากthrow new Exception( "TEST" )
บรรทัดถูกล้อมรอบด้วยการดำเนินการอื่นคุณไม่มีความคิดว่าหมายเลขบรรทัดใดที่มีข้อยกเว้นเกิดขึ้นจริง
กรณีที่ 4 คล้ายกับ case 2 เนื่องจากหมายเลขบรรทัดของข้อยกเว้นดั้งเดิมถูกเก็บรักษาไว้ แต่ไม่ใช่การสร้างใหม่จริงเนื่องจากจะเปลี่ยนชนิดของข้อยกเว้นดั้งเดิม