Существует несколько способов использования iSynaptic.Commons для разрешения исключения. Каждый найденный способ требует, чтобы метод расширения .Catch () давал понять монаде, что она молча перехватывает исключение. Кроме того, будьте осторожны при доступе к свойству возможно. Значение. Если это свойство Maybe.NoValue, будет выдано исключение InvalidOperationException.
1) Создание метода расширения «OnExceptionNoValue». Это проверит «Возможно», чтобы увидеть, есть ли исключение. Если это произойдет, NoValue Maybe будет возвращено. В противном случае оригинал Maybe будет возвращен.
public static class MaybeLocalExtensions
{
public static Maybe<T> OnExceptionNoValue<T>(this Maybe<T> maybe)
{
return maybe.Exception != null ? Maybe<T>.NoValue : maybe;
}
}
// Sample Use Case:
var maybe = Maybe.Defer(() => (string)expando.NonExistingProperty).Catch()
.OnExceptionNoValue();
2) Создать метод расширения "BindCatch". Это изменяет поведение обычного связывания, когда присутствует исключение, чтобы возвращать Maybe.NoValue вместо генерирования исключения.
public static class MaybeLocalExtensions
{
public static Maybe<TResult> BindCatch<T, TResult>(this Maybe<T> @this, Func<T, Maybe<TResult>> selector)
{
var self = @this;
return new Maybe<TResult>(() => {
if (self.Exception != null)
return Maybe<TResult>.NoValue;
return self.HasValue ? selector(self.Value) : Maybe<TResult>.NoValue;
});
}
}
// Sample Use Case:
var maybe = Maybe.Defer(() => (string)expando.NonExistingProperty).Catch()
.BindCatch(m => m.ToMaybe());
3) Этот способ также использует метод расширения Catch (), но использует свойство Maybe.HasValue вместо того, чтобы полагаться на методы расширения. Если исключение присутствует в Maybe, свойство HasValue имеет значение false. Когда это значение равно false, значение Maybe.NoValue может заменить значение переменной, возможно, или того, что необходимо сделать в этом случае.
dynamic expando = new ExpandoObject();
expando.Name = "John Doe";
// This example falls to the else block.
var maybe = Maybe.Defer(() => (string)expando.NonExistingProperty).Catch();
//In this context I would like the exception which is thrown
//to result in Maybe<string>.NoValue;
if (maybe.HasValue) {
//Do something
Console.WriteLine(maybe.Value);
} else {
maybe = Maybe<string>.NoValue; // This line is run
}
// This example uses the if block.
maybe = Maybe.Defer(() => (string)expando.Name).Catch();
//to result in Maybe<string>.NoValue;
if (maybe.HasValue) {
//Do something
Console.WriteLine(maybe.Value); //This line is run
} else {
maybe = Maybe<string>.NoValue;
}
Все эти ответы являются вариациями на одну и ту же тему, но я надеюсь, что они полезны.