मैं वर्गों है कि Process()
वस्तुओं कर सकते हैं का एक समूह मिल गया है, और अपने स्वयं के वस्तुओं वापसी:लपेटें एक IEnumerable और पकड़ अपवाद
public override IEnumerable<T> Process(IEnumerable<T> incoming) { ... }
मैं एक प्रोसेसर वर्ग है कि इन प्रोसेसर में से एक लपेट कर सकते हैं लिखना चाहते हैं, और किसी भी अपरिचित अपवाद को लॉग इन करें कि लिपटे Process()
विधि फेंक सकती है।
public override IEnumerable<T> Process(IEnumerable<T> incoming) {
try {
foreach (var x in this.processor.Process(incoming)) {
yield return x;
}
} catch (Exception e) {
WriteToLog(e);
throw;
}
}
लेकिन यह काम नहीं करता, CS1626: Cannot yield a value in the body of a try block with a catch clause की वजह से: मेरा पहला विचार कुछ इस तरह था।
तो मैं कुछ ऐसा लिखना चाहता हूं जो अवधारणात्मक समकक्ष लेकिन संकलित हो। :-) मैं इस मिल गया है:
public override IEnumerable<T> Process(IEnumerable<T> incoming) {
IEnumerator<T> walker;
try {
walker = this.processor.Process(incoming).GetEnumerator();
} catch (Exception e) {
WriteToLog(e);
throw;
}
while (true) {
T value;
try {
if (!walker.MoveNext()) {
break;
}
value = walker.Current;
} catch (Exception e) {
WriteToLog(e);
throw;
}
yield return value;
}
}
लेकिन यह है कि और अधिक जटिल की तुलना में मैं आशा व्यक्त की थी, और मैं पूरी तरह से या तो इसकी सत्यता के कुछ या नहीं कर रहा हूँ वहाँ एक बहुत सरल तरीका नहीं है कि।
क्या मैं यहां सही रास्ते पर हूं? क्या कोई आसान तरीका है?
IENumerable को सीधे और अपने MoveNext और Current के अंदर अपवादों को पकड़ने के बारे में क्या? –
@ मैट, मुझे लगता है कि यह सही जवाब है। आपको इसे ऐसा करना चाहिए था। छोटे और मीठे के साथ कुछ भी गलत नहीं है। :) –
क्यों न केवल foreach पाश और उपज को हटा दें? –