您希望API如何公开错误处理?

时间:2009-12-10 06:42:05

标签: c# api exception-handling

这个标题需要更多解释。

基本上,我正在推出一个API,它将Web服务包装在一个漂亮的heirarchical模型中。此模型以以下形式公开事物:

var obj = MyRemoteResource.GetForId(1234, SourceEnum.ThatSource);
ApiConsumerMethod(obj.SomeProperty);  //SomeProperty is lazily loaded, and often exposes such lazily loaded properties itself
... etc ...

许多不同的RemoteResources *(每个都有许多属性)。真的有积极的缓存,请求限制以防止无意中DOS服务器(以及禁止调用者的IP)。

我已经完成了所有这些代码,但是我目前在错误处理方面做的并不多。基本上,如果API的使用者提供了无效的ID,Web服务器关闭,连接超时,或者发生任何其他过多的请求层错误,只有在访问属性时才会出现异常。

我认为这远远不够理想。

所以我的问题是,我应该如何解决这些错误,以便这个API的用户能够方便地管理它们?

我考虑过的一些路线:

  • 只需将所有异常包装在一些API定义的异常中,并将其记录为抛出。
  • 公开一个静态ErrorHandler类,允许用户注册特定错误的通知回调;如果没有针对特定错误进行注册,则会回到上述行为。**
  • 出错时出现空属性,并设置LastErrorCode

这些方法中的每一种都有优点和缺点。我很欣赏他们的意见,以及我没有想过的替代方案。

如果它会影响讨论,那么抛出这些异常的平台类就是WebClient。此外,WebClient的使用足够抽象,如果需要,可以很容易地用其他一些下载方案替换。

*也就是说,许多不同的类

**这将是......很奇怪。但它映射到失败的全球性质。到目前为止,这是我最不喜欢的想法。

3 个答案:

答案 0 :(得分:2)

我不会实现花哨的错误技术(比如事件和类似的东西)。判断在何处以及如何使用异常并不容易,但这并不是实现其他东西的理由。

当你通过一个不存在的id请求一个对象时,你有什么要告诉调用者这个?如果你只是返回null,那么客户端就知道它不存在,没有什么可说的了。

异常强制调用者关心它。因此,只应在调用者需要执行特殊操作的情况下使用它们。例外可以提供为什么某些东西不起作用的信息。但如果用户也可以忽略“错误”,则异常不是最佳选择。

异常有两种常见的替代方案。

  • 使用返回值提供有关操作结果的信息。例如,logon可以返回LogonResult而不是抛出异常。
  • 写两个方法,一个抛出异常,一个(Try ...)返回一个布尔值。调用者决定是否要忽略“错误”。

答案 1 :(得分:2)

我个人认为这完全取决于您的API最终用户尝试执行的操作的上下文。如果是这种情况,您应该让他们决定如何处理错误。

最近使用CSV文件时(非常容易出错)我使用API来定义异常行为。您可以忽略错误,替换为某个默认值/操作,或将它们传递给事件处理程序。

我真的很喜欢让最终用户决定如何处理内部异常的这种方法,因为除非你的API非常具体,否则难以抢占所有场景。

答案 2 :(得分:0)

当发生不好的事情时,我更喜欢向我抛出异常。例外(对我来说,反正)是告诉出错的常用方法,我发现它更容易捕获,而不是检查null的返回值并检查另一个属性以查看出现了什么问题。