मैं एक छोटे से विस्तार के साथ आ गए हैं जब मैं जल्दी से कोशिश करने के लिए/एक IEnumerable<T>
के हर यात्रा को पकड़ने के लिए चाहते हैं
प्रयोग
public void Test()
{
List<string> completedProcesses = initialEnumerable
.SelectTry(x => RiskyOperation(x))
.OnCaughtException(exception => { _logger.Error(exception); return null; })
.Where(x => x != null) // filter the ones which failed
.ToList();
}
विस्तार
public static class OnCaughtExceptionExtension
{
public static IEnumerable<SelectTryResult<TSource, TResult>> SelectTry<TSource, TResult>(this IEnumerable<TSource> enumerable, Func<TSource, TResult> selector)
{
foreach (TSource element in enumerable)
{
SelectTryResult<TSource, TResult> returnedValue;
try
{
returnedValue = new SelectTryResult<TSource, TResult>(element, selector(element), null);
}
catch (Exception ex)
{
returnedValue = new SelectTryResult<TSource, TResult>(element, default(TResult), ex);
}
yield return returnedValue;
}
}
public static IEnumerable<TResult> OnCaughtException<TSource, TResult>(this IEnumerable<SelectTryResult<TSource, TResult>> enumerable, Func<Exception, TResult> exceptionHandler)
{
return enumerable.Select(x => x.CaughtException == null ? x.Result : exceptionHandler(x.CaughtException));
}
public static IEnumerable<TResult> OnCaughtException<TSource, TResult>(this IEnumerable<SelectTryResult<TSource, TResult>> enumerable, Func<TSource, Exception, TResult> exceptionHandler)
{
return enumerable.Select(x => x.CaughtException == null ? x.Result : exceptionHandler(x.Source, x.CaughtException));
}
public class SelectTryResult<TSource,TResult>
{
internal SelectTryResult(TSource source, TResult result, Exception exception)
{
Source = source;
Result = result;
CaughtException = exception;
}
public TSource Source { get; private set; }
public TResult Result { get; private set; }
public Exception CaughtException { get; private set; }
}
}
हम अंततः एक SkipOnException
विस्तार होने, वैकल्पिक रूप से, उदाहरण के लिए अपवाद संचालक को स्वीकार कर आगे एक सा जा सकते हैं।
आप अपवाद के दुरुपयोग पर क्या विचार करते हैं? मेरे व्यवसाय तर्क में, मेरे पास कर्मचारी के वेतन की गणना करने का एक तरीका है। ऐसी कई चीजें हैं जो कर्मचारी की तरह गलत हो सकती हैं, जिसमें वेतन सेट नहीं है। मैंने एक कस्टम अपवाद बनाया है जिसे मैं अपने नियंत्रक में फेंक और पकड़ सकता हूं और अपने दृश्य मॉडल में डाल सकता हूं। यह बुरी बात है? – Pluc
@Pluc: क्या कर्मचारी * मतलब * वेतन सेट है? यदि ऐसा है, तो यह असाधारण लगता है। अगर यह कुछ हद तक अपेक्षित है, तो शायद मैं इसे संभालने के लिए अपवादों का उपयोग नहीं करता। –