繁体   English   中英

insert方法是应该返回一个对象还是抛出异常

[英]Should an insert method return an object or throw exceptions

我正在设计一个API(第一次),它将是一个非常公开的(免费在线服务)。

我正在考虑返回结构,如InsertResult ,它可以具有失败或成功时的属性(即行数),错误消息等。 现在,另一种方法是从API插入方法中抛出异常。 我知道这是一个“一般和开放”的问题但是,对于API来说,什么被认为更干净和更完美?

脚本

API是一个DLL(内部调用和使用来自4或5个不同来源的Web服务,并且根据地理定位等内容决定与哪个服务进行交互)。 它是使用C#和Mono构建的。 使用方案包括API作为来自桌面,移动和Web客户端的库。 这确实是问题,假设一个离线用例,从Web客户端它根本不会发生但是从移动或桌面它可以(更频繁地从移动设备)做什么呢? 如何管理说插入调用以便在移动应用程序脱机时存储模拟。 或者当发生另一个(服务器相关的)错误

通常,如果用户尝试执行无效操作,则应抛出异常。 但是,您还应该提供一个代码路径,允许用户合理地检查可能在异常发生之前抛出异常的条件。 如果它很重要(可能出于性能原因),您可能希望包含一个TryInsert方法,该方法可以安全地处理无效插入,并只返回一个有效的bool来表示成功。

这适用于纯C#API以及服务API。

抛出异常是在C#/ .NET中处理错误和意外情况的更自然的方法。 此外,.NET为您提供了定义自己的异常或使用现有异常之一的可能性。
此外,通过提供诸如finally{} -blocks之类的东西,您可以在出现问题时创建非常顺畅的内容。
如果用户没有正确地对您的返回值做出反应,那么检查返回值是容易出错的,并且可能会使进程不稳定。 未处理的异常通常会停止进程,因此强制用户检查后台。 不过,这是我的看法。

MSDN上,他们说,如果例如参数错误而你不能继续错误的输入,那么抛出异常是一个很好的理由。

由于问题是“一般和开放”,我认为如果我们考虑最常用的网络服务,如谷歌,亚马逊,我认为他们都遵循尽可能精确提供细节的原则,所以任何消费它的人都知道他们做错了什么。

如果您只是提出异常,那么您的API用户可能会对您造成更多错误。

因此,总结一下,总是一个好主意来定义众所周知的错误代码并将相同的信息传递给客户/消费者,这样他们就可以轻松找出问题的错误或我该怎么做才能纠正错误。 仅仅为了一个例子,由于某些原因你的api只接受特定的编码,那么用户将会对此感到沮丧。

我建议返回一个详细的错误。 由于您使用Web服务进行消费,因此并非所有人都使用相同的技术与其进行交互。 如果您在制作框架的地方,那么我会说使用异常,因为开发人员将使用相同的技术来使用它。 这是异常在框架级别更有用的地方。

UPDATED(有问题的API实际上是一个框架):由于您现在正在讨论使用框架,因此您应该抛出异常,因为客户端必须引用DLL并且知道可能的框架异常。 要使用这些库,它必须是符合CLR的语言,因此它们应该具有相同的概念,类,异常等......

对于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM