首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在任务内部还是外部抛出NotSupportedException更好?

在任务内部还是外部抛出NotSupportedException更好?
EN

Stack Overflow用户
提问于 2013-04-23 07:50:09
回答 1查看 1.2K关注 0票数 4

我们有一个下游系统,一个ERP系统,可以通过SOAP公开它的表。它发布的web服务通常具有Create、Update和Delete方法。然后,我们使用svcutil生成代理,包括异步方法。最后,我们将ACL放在前面,以便其他系统与之交互。

我们还发现了一个重要的不变成本计算信息--项目的不变成本信息只能由ERP系统本身更新。然而,真正愚蠢的API将允许消费者这样做。

我的想法是将WCF proxy子类化,并有显式的实现来更新抛出的NotSupportedException。不,这不会阻止开发人员生成自己的代理并执行它。但至少我们可以保证在通过ACL时不会发生这种情况。

代码语言:javascript
复制
    Update_Result Item_Port.Update(Update request)
    {
        throw new NotSupportedException();
    }

对于异步方法,我可以这样做

代码语言:javascript
复制
    Task<Update_Result> Item_Port.UpdateAsync(Update request)
    {
        throw new NotSupportedException();
    }

代码语言:javascript
复制
    Task<Update_Result> Item_Port.UpdateAsync(Update request)
    {
        return Task.Factory.StartNew<Update_Result>(() =>
        {
            throw new NotSupportedException();
        });
    }

从异步的角度来看,哪一个更“正确”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-23 07:59:26

这两者会有不同的行为。

在第一种情况下,此接口的调用者将在调用此方法后立即获取NotSupportedException

在第二种情况下,调用者将收到出现故障的Task<T> (或者在发出调用后不久就会出现故障)。这将在任务的继续执行或获取任务的值时导致异常(通过task.Result)。

考虑到你的目标,我个人会选择第一种方法。这有较少的开销(您不是在创建任务),并且它使调用站点立即明显地发现有问题。虽然它不如编译时错误好,但在调试过程中被遗漏的可能性要小得多,因为即使任务是以“触发并忘记”的方式调用的,它也会抛出异常。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16158613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档