这个标题需要更多解释。
基本上,我正在推出一个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的用户能够方便地管理它们?
我考虑过的一些路线:
ErrorHandler
类,允许用户注册特定错误的通知回调;如果没有针对特定错误进行注册,则会回到上述行为。** LastErrorCode
。这些方法中的每一种都有优点和缺点。我很欣赏他们的意见,以及我没有想过的替代方案。
如果它会影响讨论,那么抛出这些异常的平台类就是WebClient。此外,WebClient
的使用足够抽象,如果需要,可以很容易地用其他一些下载方案替换。
*也就是说,许多不同的类
**这将是......很奇怪。但它映射到失败的全球性质。到目前为止,这是我最不喜欢的想法。
答案 0 :(得分:2)
我不会实现花哨的错误技术(比如事件和类似的东西)。判断在何处以及如何使用异常并不容易,但这并不是实现其他东西的理由。
当你通过一个不存在的id请求一个对象时,你有什么要告诉调用者这个?如果你只是返回null,那么客户端就知道它不存在,没有什么可说的了。
异常强制调用者关心它。因此,只应在调用者需要执行特殊操作的情况下使用它们。例外可以提供为什么某些东西不起作用的信息。但如果用户也可以忽略“错误”,则异常不是最佳选择。
异常有两种常见的替代方案。
logon
可以返回LogonResult
而不是抛出异常。答案 1 :(得分:2)
我个人认为这完全取决于您的API最终用户尝试执行的操作的上下文。如果是这种情况,您应该让他们决定如何处理错误。
最近使用CSV文件时(非常容易出错)我使用API来定义异常行为。您可以忽略错误,替换为某个默认值/操作,或将它们传递给事件处理程序。
我真的很喜欢让最终用户决定如何处理内部异常的这种方法,因为除非你的API非常具体,否则难以抢占所有场景。
答案 2 :(得分:0)
当发生不好的事情时,我更喜欢向我抛出异常。例外(对我来说,反正)是告诉出错的常用方法,我发现它更容易捕获,而不是检查null的返回值并检查另一个属性以查看出现了什么问题。