C#中如何使用LanguageExt.Core的TryAsync实例并处理返回结果与异常
处理LanguageExt中TryAsync返回结果的方案
核心处理方式:使用Match方法
TryAsync是LanguageExt封装的异步异常安全操作容器,最标准的消费方式是调用它的Match方法,自动匹配执行成功和抛出异常两个分支,无需手动编写try/catch代码:
// 调用重构后的Relay方法,直接通过Match处理结果 var result = await Relay(workflowTask, montageData, sourceFile, cancellationToken) .Match( Succ: uploadSuccess => { // 此处写上传成功后的业务逻辑,uploadSuccess就是TryAsync返回的bool类型结果 return (uploadSuccess, string.Empty); }, Fail: ex => { // 此处处理异常逻辑,执行日志记录 _logger.LogError(ex, $"File cannot be uploaded: {sourceFile.Name}", workflowTask); return (false, ex.ToString()); } );
上述代码返回的result和你原有方法的Task<(bool, string)>类型完全一致,可直接兼容原有上层调用逻辑。
可选优化:内聚异常处理逻辑到Relay方法
如果你希望把日志记录、返回值封装的逻辑都收拢到Relay方法内部,不需要上层调用方处理异常,可以直接对TryAsync做链式操作,调整方法定义如下:
// 补回你重构时遗漏的WorkflowTask参数,供日志记录使用 private TryAsync<(bool Success, string ErrorMsg)> Relay( WorkflowTask workflowTask, MontageUploadConfig montageData, File sourceFile, CancellationToken cancellationToken ) => TryAsync(async () => { byte[] fileContent = await _httpClient.GetByteArrayAsync(sourceFile.Url, cancellationToken); bool uploadResult = await _attachmentController.TryUploadAttachment(montageData.EventId, fileContent, sourceFile.Name); return (uploadResult, string.Empty); }) .IfFail(ex => { // 异常发生时自动执行日志记录 _logger.LogError(ex, $"File cannot be uploaded: {sourceFile.Name}", workflowTask); return (false, ex.ToString()); });
调整后上层调用方可以直接拿到结构化的返回结果,无需额外处理异常:
var (isSuccess, errorMsg) = await Relay(workflowTask, montageData, sourceFile, cancellationToken).IfFail(default); // 直接用isSuccess和errorMsg做后续业务判断即可
补充说明
TryAsync已经内置了全量异常捕获逻辑,方法内部所有抛出的异常都会自动进入Fail分支,不需要额外添加try/catch块。- 如果你需要更灵活的分支判断,也可以搭配
IfSucc/IfFail/ToEither等方法实现不同的业务需求。
内容的提问来源于stack exchange,提问作者Brian Kessler
相关产品推荐
相关产品推荐

