我正在设计一个API(第一次),它将是一个非常公开的(免费在线服务)。
我正在考虑返回结构,例如InsertResult
,它可以具有失败或成功时的属性(即行数),错误消息等。现在,另一种方法是从API插入方法中抛出异常。我知道这是一个“一般和开放”的问题但是,对于API来说,什么被认为更干净和更完美?
方案
API是一个DLL(内部调用和使用来自4个或5个不同来源的Web服务,并且根据地理位置等内容决定与哪个服务进行交互)。它是使用C#和Mono构建的。使用方案包括API作为来自桌面,移动和Web客户端的库。这确实是问题,假设一个离线用例,从Web客户端它根本不会发生但是从移动或桌面它可以(更频繁地从移动设备)做什么呢?如何管理说插入调用以便在移动应用程序脱机时存储模拟。或者当发生另一个(服务器相关的)错误时。
答案 0 :(得分:2)
通常,如果用户尝试执行无效操作,则应抛出异常。
但是,您还应该提供一个代码路径,允许用户合理地检查可能在异常发生之前抛出异常的条件。如果它很重要(可能出于性能原因),您可能希望包含一个安全处理无效插入的TryInsert
方法,只需返回bool
有效即可表示成功。
这适用于纯C#API以及服务API。
答案 1 :(得分:2)
抛出异常是在C#/ .NET中处理错误和意外情况的自然方法。此外,.NET为您提供了定义自己的异常或使用已有异常之一的可能性
此外,通过提供诸如finally{}
之类的东西 - 你可以在出现问题时创造非常顺利的事情
如果用户没有正确地对您的返回值做出反应,那么检查返回值是容易出错的,并且可能会使进程不稳定。未处理的异常通常会停止进程,因此强制用户检查后台。不过,这是我的看法。
在MSDN他们说,如果例如参数错误并且你不能继续错误的输入,那么抛出异常就是一个很好的理由。
答案 2 :(得分:2)
由于问题是“一般和开放”,我认为如果我们考虑最常用的网络服务,如谷歌,亚马逊,我认为他们都遵循尽可能准确的细节原则,所以任何消费它的人都知道他们做错了什么
如果您只是提出异常,那么您的API用户可能会对您造成更多错误。
总而言之,总结一个好主意是定义众所周知的错误代码并将相同的信息传递给客户/消费者,以便他们可以轻松找出问题的错误或我该怎么做才能纠正错误。 仅仅为了一个例子,由于某些原因你的api只接受特定的编码,那么用户将会对此感到沮丧。
答案 3 :(得分:2)
我建议您返回详细错误。由于您使用Web服务进行消费,因此并非所有人都使用相同的技术与其进行交互。如果您在制作框架的地方,那么我会说使用异常,因为开发人员将使用相同的技术来使用它。这是异常在框架级别更有用的地方。
UPDATED(有问题的API实际上是一个框架): 由于您现在正在讨论使用框架,因此您应该抛出异常,因为客户端必须引用DLL并且知道可能的框架异常。要使用这些库,它必须是符合CLR的语言,因此它们应该具有相同的概念,类,异常等......
答案 4 :(得分:0)
对于API,异常总是更好。 API使用者可以使用catch块对各种异常进行操作。如果您使用错误消息和错误代码,则要求API使用者编写If语句。下面的代码段总是比你有的东西更干净If条件来检查错误。
因此,从API消费者的角度来看,它总是更加清晰,因为API会引发异常
try
{
yourAPIClass.YourMethod();
}
catch(YourException1 ex)
{
action1();
}
catch(YourException2 ex)
{
action1();
}
这是编写和抛出异常的良好指南 http://blogs.msdn.com/b/kcwalina/archive/2005/03/16/396787.aspx