如果GetValue()方法失败,则引发错误

时间:2012-05-08 14:22:48

标签: c# wcf exception-handling trygetvalue

我继承了一个WCF服务,它充当文件缓存(每个文件代表对第三方API的请求结果)。目前,如果文件不存在,代码会创建一个新的请求来创建数据,并且还会引发客户端代码的异常。

我认为这个想法是客户端会再次请求文件,然后它们就可以使用了(生成文件需要几秒钟)。

我认为这里有代码味道,我应该重写这一部分。目前,异常被捕获并通过几种方法冒出来。我想我应该在源头建立文件是否存在并将该信息传递给调用堆栈。

在WCF界面,我目前有一个GetValue()方法,虽然有两个选项,我认为我可以用来替换它:

  1. 如果文件不存在,则返回null
  2. 使用bool TryGetValue(string key, out string value)方法
  3. 有没有人有任何偏好/推荐?

    由于

1 个答案:

答案 0 :(得分:1)

“TryGet”方法更加明确。使用null返回方法,您必须记录该方法因此而返回null,这需要开发人员阅读文档。众所周知,有些人对阅读文档过敏。

“TryGet”方法的另一个优点是,您可以使用枚举而不是bool,为调用者提供有关该方法失败(或成功)的原因和方式的更多信息。

  Jeffrey Richter(C#中的CLR)异常定义:当一个动作成员无法完成其任务时,该成员应该抛出异常。异常意味着操作成员未能完成其应执行的任务,如其名称所示。我的问题是我应该为客户端保留GetValue方法,并在数据不可用时引发错误或将其删除并用TryGetValue()替换它?

当您确定API的设计时,Jeffrey Richter的定义没有用,因为这包括确定每个操作成员的任务应该是什么。

在您的设计中,您当然希望价值不可用;这意味着对于值不可用而言并非特殊情况。因此我只使用 TryGet ...模式。

但是,说实话,我会采取完全不同的方法。假设有人尝试这种方法:

while (!TryGetValue(key, out value)) {}

或:

SomeType value;
bool flag = false;
while (!flag)
{
    try
    {
        value = GetValue(key);
        flag = true;
     }
     catch {}
}

您的WCF服务将获得大量点击。查看异步模型可能会更好,因此在结果准备好时通过回调通知客户端,而不是邀请客户端不断轮询服务。