मुझे 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;
}
क्या 'कैच, जब' फीचर का उपयोग तेजी से करता है क्योंकि हैंडलर को ऐसे ही छोड़ दिया जाता है और स्टैक अनइंडिंग बहुत पहले हो सकता है जब हैंडलर के भीतर विशिष्ट उपयोग के मामलों को संभालने की तुलना में होता है? क्या कोई विशिष्ट उपयोग के मामले हैं जो इस सुविधा को बेहतर ढंग से फिट करते हैं जिन्हें लोग बाद में एक अच्छे अभ्यास के रूप में अपना सकते हैं?
try..catch...catch..catch..finally
?
catch (Exception ex)
सकते हैं, प्रकार की जांच कर सकते हैं और throw
अन्यथा। थोड़ा और अधिक संगठित कोड (उर्फ कोड शोर से बचने) वास्तव में इस सुविधा मौजूद है। (यह वास्तव में बहुत सारी विशेषताओं के लिए सच है।)
when
अपवादों को स्वयं एक्सेस करने की आवश्यकता है