ฉันเจอคุณลักษณะใหม่นี้ใน C # ซึ่งช่วยให้ตัวจัดการการจับสามารถดำเนินการได้เมื่อตรงตามเงื่อนไขที่กำหนด
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
ฉันพยายามทำความเข้าใจว่าสิ่งนี้อาจเป็นประโยชน์เมื่อใด
สถานการณ์หนึ่งอาจเป็นดังนี้:
try
{
DatabaseUpdate()
}
catch (SQLException e)
when (driver == "MySQL")
{
//MySQL specific error handling and wrapping up the exception
}
catch (SQLException e)
when (driver == "Oracle")
{
//Oracle specific error handling and wrapping up of exception
}
..
แต่นี่เป็นอีกครั้งที่ฉันสามารถทำได้ภายในตัวจัดการเดียวกันและมอบหมายวิธีการต่างๆขึ้นอยู่กับประเภทของไดรเวอร์ สิ่งนี้ทำให้เข้าใจรหัสง่ายขึ้นหรือไม่? ไม่มีเหตุผล
อีกสถานการณ์หนึ่งที่ฉันคิดได้ก็คือ:
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{
//some specific error handling that this layer can handle
}
catch (Exception e) //catchall
{
throw;
}
อีกครั้งนี่คือสิ่งที่ฉันสามารถทำได้เช่น:
try
{
SomeOperation();
}
catch(SomeException e)
{
if (condition == true)
{
//some specific error handling that this layer can handle
}
else
throw;
}
การใช้คุณลักษณะ 'จับเมื่อ' ทำให้การจัดการข้อยกเว้นเร็วขึ้นเนื่องจากตัวจัดการถูกข้ามไปเช่นนี้และการคลายสแต็กอาจเกิดขึ้นเร็วกว่ามากเมื่อเทียบกับการจัดการกรณีการใช้งานเฉพาะภายในตัวจัดการหรือไม่ มีกรณีการใช้งานเฉพาะใดบ้างที่เหมาะกับคุณสมบัตินี้ซึ่งผู้คนสามารถนำไปใช้เป็นแนวปฏิบัติที่ดีได้หรือไม่?
when
จำเป็นต้องเข้าถึงข้อยกเว้นเอง