Exception 失败的方法
我有一个方法(或者函数,或者过程,对于这个问题来说无关紧要)Exception 失败的方法,exception,api-design,Exception,Api Design,我有一个方法(或者函数,或者过程,对于这个问题来说无关紧要)void DoStuff()。这取决于一些数据,并且有副作用。而且,该操作仅在特定状态下有效;在某些其他状态下,无法执行此操作 现在,虽然我正在将其开发为一个API,但我正在考虑该API将实际用于何处。执行此操作有两种典型情况: 用户代码应该检查状态是否有效,如果无效,则实现自己的自定义逻辑。如果此代码最终试图在无效状态下实现此操作,则表示这是程序员错误,应该报告并调查 在这种情况下,客户机实际上不需要执行任何自定义逻辑,甚至不需要知道
void DoStuff()
。这取决于一些数据,并且有副作用。而且,该操作仅在特定状态下有效;在某些其他状态下,无法执行此操作
现在,虽然我正在将其开发为一个API,但我正在考虑该API将实际用于何处。执行此操作有两种典型情况:
DoStuff()
,或者,比方说,使用给定语言的功能尽可能大声地报告错误以表示逻辑错误。另一个是,TryDoStuff()
,它根本不会做任何错误报告,并且会自动失败
因此,我有两个问题:
TryDoStuff()
有效吗(这种语言与任何特定的语言无关。我使用C#语法作为示例,但这个问题与C#无关,甚至与OOP无关,所以请不要添加这些标记)。这可以通过多种方式解决:
- 返回操作结果,失败时抛出
- 失败时返回操作结果或默认值
- 失败时返回操作结果或错误指示器
- 返回一个复杂的结果对象,其状态之一可以表示失败
Parse
/TryParse
方法经常成对出现一样,您可能希望为每个方法提供一个“受保护的”和一个明显失败的变体。更准确地说,以下三种处理方法似乎是可行的:
- 如上所述,为每种方法提供两种变体
- 提供几个可以访问方法的API对象,一个是“受保护的”,另一个是失败的
- 提供控制所有方法的一般行为的全局API模式设置
- API的用户习惯于什么;目标环境中有哪些约定
- API应该传达什么样的隐喻?例如,使用API“感觉”应该像使用“设备”一样,还是像在轻量级服务模块上调用函数一样
Try…()
方法对.NET开发人员意味着某种固定的操作模式,而在其他平台上可能不以相同的名称为人所知。public void DoStuff(bool throwOnFailure=true)