我个人的看法:这两种方法都有其用途。这取决于为什么会出现这种情况,是否可以防止这种情况发生,客户可以采取哪些措施来防止这种情况发生。
服务器:
method SetBalance(int balance)
{
// do something only if balance >= 0
}
客户:
myServer.SetBalance(balance);
情况 1:
这种情况的出现只是因为某处(服务器或客户端)的错误。抛出异常。让责任方修复其代码。
情况 2:
从某些外部依赖项接收到错误输入。客户可以很容易地检查前提条件。抛出异常,如果客户对此不满意,请让客户修复其代码。
if(balance>0)
myServer.SetBalance(balance);
else
//take appropriate action.
情况 3:
从某些外部依赖项接收到错误输入。客户无法轻松检查前提条件。示例:它需要客户端解析一个字符串,这是服务器的工作。在这里,服务器应该返回成功是有道理的:
bool succeeded = myServer.SetBalance(balance);
if(!succeeded)
//take appropriate action.
写下我的答案后,我注意到这一切都归结为:客户端不应该使用 try-catch 来调用方法 SetBalance。(要么是错误所以不要捕获异常,或者自己检查前置条件,或者检查返回值)
这是有关相关主题的好读物:http: //blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx
编辑:
乔乔提出了一个很好的观点。如果有可能失败,请重命名方法TrySetBalance() 。