diff --git a/.gitignore b/.gitignore index 070b636..f9e37fc 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,5 @@ Generated_Code #added for RIA/Silverlight projects _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML + +\.idea/ diff --git a/Chain/Chain.cs b/Chain/Chain.cs index aef0aeb..f5c7e76 100644 --- a/Chain/Chain.cs +++ b/Chain/Chain.cs @@ -1,5 +1,4 @@ - -using System; +using System; namespace Chain { @@ -7,7 +6,14 @@ public abstract class Chain { public static OngoingChaining Do(Func startFunction) where T : class { - return new OngoingChaining(startFunction()); + try + { + return new OngoingChaining(startFunction()); + } + catch + { + return new OngoingChaining(null); + } } public static OngoingChaining Do(T startObject) where T : class @@ -15,4 +21,4 @@ public static OngoingChaining Do(T startObject) where T : class return new OngoingChaining(startObject); } } -} +} \ No newline at end of file diff --git a/Chain/OngoingChaining.cs b/Chain/OngoingChaining.cs index 2c13b79..4c7f531 100644 --- a/Chain/OngoingChaining.cs +++ b/Chain/OngoingChaining.cs @@ -4,16 +4,44 @@ namespace Chain { public class OngoingChaining where T : class { - private T _currentResult; + private T _currentResult; + private Action _errorFallback; + private Action _globalErrorFallback; internal OngoingChaining(T currentResult) { _currentResult = currentResult; } + public OngoingChaining WithErrorFallback(Action onError) + { + _errorFallback = onError; + return this; + } + + public OngoingChaining WithGlobalErrorFallback(Action onError) + { + _globalErrorFallback = onError; + return this; + } + public OngoingChaining Then(Func nextFunction) where TNext : class { - return _currentResult != null ? new OngoingChaining(nextFunction(_currentResult)) : new OngoingChaining(null); + try + { + var result = _currentResult != null + ? new OngoingChaining(nextFunction(_currentResult)) + : new OngoingChaining(null); + + _errorFallback = null; + return result; + } + catch (Exception ex) + { + _errorFallback?.Invoke(ex); + _globalErrorFallback?.Invoke(ex); + return null; + } } public OngoingChaining OrElse(T fallback)