วันอาทิตย์ที่ 2 พฤษภาคม พ.ศ. 2553

การทำงานของ try catch และ finally ใน .NET

try
{
// 1 - ทำตามปกติ
}
catch ("ชนิดException" "ชื่อตัวแปลที่รองรับException")
{
// 2.1 - ทำเมื่อ เกิด Exception ตามชนิดที่เขียนไว้
}
catch ("ชนิดException" "ชื่อตัวแปลที่รองรับException")
{
// 2.2 - ทำเมื่อ เกิด Exception ตามชนิดที่เขียนไว้
}
finally
{
// 3 - ทำหลังจากสิ้นสุดภายใต้ Try หรือ Catch ใดๆ โดยไม่ว่า จะเกิด Exception หรือไม่ ?
}


ตัวอย่าง


Object oItem = null;
try
{
oItem
.ToString();
}
catch (NullPointerException exNull)
{
MessageBox.Show("Error : " + exNull.Message);
}
catch (Exception exAll)
{
MessageBox.Show("Error : " + exAll.Message);
}
finally
{
oItem
= "Hello World";
}


จากตัวอย่างคือ พอเข้า Try และถึงคำสั่งที่ oItem.ToString(); นั้น จะเกิด NullPointerException เนื่องจาก oItem เป็น Null อยู่ จึงไม่สามารถเรียก Method ใดๆ ได้

นั่นคือจะเข้า catch (NullPointerException exNull) ครับ และสิ่งที่มันทำต่อจากนั้นคือ MessageBox.Show("Error : " + exNull.Message); และพอจบภายใน catch นี้ ก็จะเข้าไปทำต่อใน Finally นั่นก็คือ oItem = "Hello World";

แต่ถ้าตัวอย่างนี้


Object oItem = "Hello";
try
{
int.Parse(oItem.ToString());
}
catch (NullPointerException exNull)
{
MessageBox.Show("Error : " + exNull.Message);
}
catch (Exception exAll)
{
MessageBox.Show("Error : " + exAll.Message);
}
finally
{
oItem
= "Hello World";
}


จะเหมือนกับตัวอย่างด้านบนครับ แต่รอบนี้ จะเข้า Exception ใน catch (Exception exAll) ครับ เนื่องจากไม่มี NumericException มารองรับ ครับ



สรุปนะครับ นั่นคือ ทุกอย่างที่โปรแกรมจะ Execute ใน Try นั้น หากเกิดการผิดพลาด Exception สิ่งที่จะทำต่อไปคือ มันจะวิ่งไปหา Catch Exception ที่ตรงกับชนิดของ Exception ที่เกิดขึ้นก่อน หากไม่มี มันจะวิ่งไปหา catch (Exception) เป็นสิ่งสุดท้ายครับ


และหากจบการ execute ใน catch หรือ try เสร็จ หากมี finally ต่อหลังรออยู่ มันก็จะทำในนั้นต่อครับ

ที่มา http://www.narisa.com/forums/index.php?showtopic=27855