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

C# 您希望API如何公开错误处理?,c#,api,exception-handling,C#,Api,Exception Handling,这个标题需要更多的解释 基本上,我正在滚动一个API,它将web服务包装在一个很好的体系结构模型中。此模型以以下形式公开内容: var obj = MyRemoteResource.GetForId(1234, SourceEnum.ThatSource); ApiConsumerMethod(obj.SomeProperty); //SomeProperty is lazily loaded, and often exposes such lazily loaded properties i

这个标题需要更多的解释

基本上,我正在滚动一个API,它将web服务包装在一个很好的体系结构模型中。此模型以以下形式公开内容:

var obj = MyRemoteResource.GetForId(1234, SourceEnum.ThatSource);
ApiConsumerMethod(obj.SomeProperty);  //SomeProperty is lazily loaded, and often exposes such lazily loaded properties itself
... etc ...
其中存在许多不同的RemoteResources*,每个都有许多属性。有真正的攻击性缓存正在进行,请求节流,以防止无意中关闭服务器,并禁止调用方的IP

我已经完成了所有这些代码的工作,但目前我在错误处理方面做得不多。基本上,如果API的使用者提供了无效的ID,web服务器关闭,连接超时,或者出现了大量请求层错误,那么访问属性时就会出现异常

我认为这远不是理想的。

所以我的问题是,我应该如何包装这些错误,以便该API的用户方便地管理它们

我考虑过的一些路线:

只需将所有异常包装在一些API定义的异常中,并将它们记录为抛出的异常。 公开静态ErrorHandler类,该类允许用户注册特定错误的通知回调;当没有针对特定错误进行注册时,返回到上述行为** 错误时为Null属性,并设置LastErrorCode。 这些方法各有优缺点。我会很感激对它们的意见,以及我没有想到的替代方案

如果它对讨论有任何影响,抛出这些异常的平台类将被忽略。此外,WebClient的使用非常抽象,如果需要,可以很容易地用其他下载方案替换它

*也就是说,很多不同的班级


**这将是。。。维尔德。但它反映了失败的全球性质。到目前为止,这是我最不喜欢的想法。

我更喜欢在发生不好的事情时向我抛出异常。对我来说,异常是判断出问题的常用方法,我发现捕获异常比检查返回值是否为null和检查另一个属性以查看出了什么问题更直观。

我更喜欢在发生错误时向我抛出异常。对我来说,异常是一种常见的判断出错的方法,我发现捕获异常比检查返回值是否为null和检查另一个属性以查看出错情况更直观。

我不会实现像事件之类的奇特错误技术。判断在何处以及如何使用异常并不容易,但这并不是实现其他东西的理由

当您通过一个不存在的id请求一个对象时,您需要告诉调用者什么?如果您只返回null,那么客户机知道它不存在,没有更多要说的了

异常迫使调用方关心它。因此,它们只应用于要求调用方执行特殊操作的情况。异常可以提供某些东西不工作的原因。但如果这是一个用户也可以忽略的错误,那么异常并不是最佳选择

例外情况有两种常见的替代方法

使用返回值提供有关操作结果的信息。例如,logon可以返回LogonResult,而不是引发异常。 写两个方法,一个抛出异常,一个尝试。。。返回布尔值。调用方决定是否忽略错误。
我不会实现像事件之类的奇特错误技术。判断在何处以及如何使用异常并不容易,但这并不是实现其他东西的理由

当您通过一个不存在的id请求一个对象时,您需要告诉调用者什么?如果您只返回null,那么客户机知道它不存在,没有更多要说的了

异常迫使调用方关心它。因此,它们只应用于要求调用方执行特殊操作的情况。异常可以提供某些东西不工作的原因。但如果这是一个用户也可以忽略的错误,那么异常并不是最佳选择

例外情况有两种常见的替代方法

使用返回值提供有关操作结果的信息。例如,logon可以返回LogonResult,而不是引发异常。 写两个方法,一个抛出异常,一个尝试。。。返回布尔值。调用方决定是否忽略错误。
我个人认为,这完全取决于API最终用户试图做什么的上下文。如果是这种情况,你应该让他们决定如何处理EROR

最近,在处理CSV文件时,我使用了一个允许您定义异常行为的。您可以忽略错误,替换为一些默认值/操作,或者将它们传递给事件处理程序

我真的很喜欢这种让你结束的方法
ser决定如何处理内部异常,因为除非您的API非常具体,否则很难抢占所有场景

我个人认为这完全取决于您的API最终用户试图做什么。如果是这种情况,你应该让他们决定如何处理EROR

最近,在处理CSV文件时,我使用了一个允许您定义异常行为的。您可以忽略错误,替换为一些默认值/操作,或者将它们传递给事件处理程序


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

这比我的答案要好得多:这个API的延迟加载特性使得很难立即确定id是否有效。一个完全有效的用例是从缓存在文件中的ID say构造一个大型项目集,然后迭代它们的一些属性集。只有访问了一个属性,id的有效性才可以确定。这比我的回答要好得多:或者这个API的延迟加载特性使得很难立即确定id是否有效。一个完全有效的用例是从缓存在文件中的ID say构造一个大型项目集,然后迭代它们的一些属性集。只有访问一个属性,ID的有效性才能确定。基本上我同意,但是CSV解析比特定的服务器API更通用。我不认为你的建议真的有那么大的不同。例如,LogonResult对象可能会包含一些处理来吞咽异常,并设置一个指定错误发生的属性。我更希望通过一个简单的属性将其公开,而不是将它们放在包装类型中,因为在许多情况下,最终用户只需将这些LogonResult值映射到他们自己的应用程序xlogonResult,或者直接映射到GUI/命令行/日志文件。如果你把事情留给用户,那么他们就可以直接使用这些值,而不必处理其他类型的值。基本上我同意,但是CSV解析比特定的服务器API更通用。我认为你的建议没有那么大的不同。例如,LogonResult对象可能会包含一些处理来吞咽异常,并设置一个指定错误发生的属性。我更希望通过一个简单的属性将其公开,而不是将它们放在包装类型中,因为在许多情况下,最终用户只需将这些LogonResult值映射到他们自己的应用程序xlogonResult,或者直接映射到GUI/命令行/日志文件。如果你把事情留给用户,那么他们可以直接使用这些值,而不必处理这些其他类型的值。我更愿意检查返回值,而不是抛出异常。我把异常与完全出乎意料的事情联系在一起。我想这只是为了展示不同的编程风格。我更愿意检查返回值,而不是抛出异常。我把异常与完全出乎意料的事情联系在一起。我想这只是为了展示不同的编程风格。