आपको लूप करना है, और लूप में होना है, लूप को एक अलग फ़ंक्शन में स्थानांतरित करने के लिए क्लीनर है।
मैंने इससे निपटने के लिए एक विस्तार विधि बनाई। यह अपवाद का पीछा करते हुए, निर्दिष्ट प्रकार के सभी आंतरिक अपवादों की एक सूची देता है। InnerException और AggregateException.InnerException।
मेरी विशेष समस्या में, आंतरिक अपवादों का पीछा करना सामान्य से अधिक जटिल था, क्योंकि अपवादों को उन वर्गों के कंस्ट्रक्टर द्वारा फेंका जा रहा था जिन्हें प्रतिबिंब के माध्यम से आमंत्रित किया जा रहा था। जो अपवाद हम पकड़ रहे थे, उनमें इनरस्टेपेशन ऑफ़ टाइप इनवर्टेशन एक्सेप्शन था, और जिन अपवादों को हमें वास्तव में देखने की जरूरत थी, वे पेड़ में गहरे दबे हुए थे।
public static class ExceptionExtensions
{
public static IEnumerable<T> innerExceptions<T>(this Exception ex)
where T : Exception
{
var rVal = new List<T>();
Action<Exception> lambda = null;
lambda = (x) =>
{
var xt = x as T;
if (xt != null)
rVal.Add(xt);
if (x.InnerException != null)
lambda(x.InnerException);
var ax = x as AggregateException;
if (ax != null)
{
foreach (var aix in ax.InnerExceptions)
lambda(aix);
}
};
lambda(ex);
return rVal;
}
}
उपयोग बहुत सरल है। यदि, उदाहरण के लिए, आप जानना चाहते हैं कि क्या हमने सामना किया
catch (Exception ex)
{
var myExes = ex.innerExceptions<MyException>();
if (myExes.Any(x => x.Message.StartsWith("Encountered my specific error")))
{
}
}
LibraryException -> LibraryException -> LibraryException -> MyException
। मेरा अपवाद हमेशा श्रृंखला पर अंतिम होता है और इसका अपना आंतरिक अपवाद नहीं होता है।