ยังคงเลื่อนลง? จัดไป!
คำถามนี้ทำให้ฉันมีช่วงเวลาที่ยากลำบาก
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
จะพิมพ์อะไรในสถานการณ์ข้างต้น? ใช่เดาถูก:
เช่นข้อความ - ไม่ว่าจะเป็นอะไรก็ตาม (อาจพยายามหารด้วยศูนย์)
สุดท้ายบล็อก
หลังจากในที่สุด
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
นี่จะพิมพ์อะไร ไม่มีอะไร! มันแสดงข้อผิดพลาดเนื่องจากบล็อกการจับทำให้เกิดข้อผิดพลาด
ในโครงสร้างการเขียนโปรแกรมที่ดีข้อยกเว้นของคุณจะถูกยกเลิกในแง่ที่ว่าโค้ดนี้จะถูกจัดการจากเลเยอร์อื่น เพื่อกระตุ้นกรณีดังกล่าวฉันจะซ้อนรหัสนี้
try
{
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block")
}
console.writeline("After finally");
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
ในกรณีนี้ผลลัพธ์จะเป็น:
- สุดท้ายบล็อก
- เช่นข้อความ - ไม่ว่าจะเป็นอะไรก็ตาม
เป็นที่ชัดเจนว่าเมื่อคุณจับข้อยกเว้นและโยนอีกครั้งในชั้นอื่น ๆ (Funneling) รหัสหลังจากโยนจะไม่ถูกดำเนินการ มันทำหน้าที่คล้ายกับการทำงานของผลตอบแทนภายในฟังก์ชัน
ตอนนี้คุณรู้แล้วว่าทำไมไม่ปิดทรัพยากรของคุณด้วยรหัสหลังจากบล็อกจับวางไว้ในบล็อกในที่สุด