如何从已失败的LanguageExt.Common.Result中提取异常?
解决方案
1. 从失败的Result中提取异常
当Result<T>处于失败状态(IsFaulted = true)时,直接通过result.Exception属性即可获取捕获到的异常,修改后的DoNext方法如下:
public async Task<Result<MyClass>> DoNext() { var result = await DoSomething(); if (result.IsFaulted) { return new Result<MyClass>(result.Exception); } var data = new MyClass(); return new Result<MyClass>(data); }
2. 异步场景下的Match处理方案
你遇到的lambda无法异步执行的问题,是因为使用了同步版本的Match方法。LanguageExt针对异步场景提供了MatchAsync方法,支持异步lambda表达式,修改最初版本的代码如下:
public async Task<Result<MyClass>> DoNext() { var result = await DoSomething(); return await result.MatchAsync( async canDo => { var myClass = await GetAsync(...); return new Result<MyClass>(myClass); }, ex => Task.FromResult(new Result<MyClass>(ex)) ); }
额外简化方案:使用BindAsync链式调用
你还可以用BindAsync方法替代手动判断状态,它会自动传递失败状态的异常,进一步简化代码:
public async Task<Result<MyClass>> DoNext() { return await DoSomething() .BindAsync(async canDo => { var myClass = await GetAsync(...); return new Result<MyClass>(myClass); }); }
内容的提问来源于stack exchange,提问作者acmoune
相关产品推荐
相关产品推荐

