我应该抛出异常还是返回false?

时间:2019-01-05 07:36:27

标签: c# exception-handling tdd

我正在使用TDD在C#中开发一个简单的服务定位器。

此刻,我已经创建了一个TryAddService方法,如下所示:

    public bool TryAddService(Type type, object service)
    {
        if (service == null)
        {
            return false;
        }

        if (this.services.ContainsKey(type))
        {
            return false;
        }

        if (!type.IsAssignableFrom(service.GetType()))
        {
            return false;
        }

        this.services.Add(type, service);

        return true;
    }

我的问题是,在所有这些情况下我应该返回假吗?还是应该抛出异常?

在这种情况下,我的客户将是其他开发人员。

3 个答案:

答案 0 :(得分:0)

我使用这种情况: 我有一个所有服务都返回该类的类(例如MyReturn)

public sealed class MyReturn<TEntity> : IDisposable
{
    public string Message { get; set; }
    public TEntity Entity { get; set; }
    public string SysException { get; set; }
    // and etc...
    public void Dispose() {}
}

现在为您服务:

public MyReturn <bool> TryAddService(Type type, object service)
{
    if (service == null)
        return new MyReturn <bool> {Message = "Your messgage"};
    //and etc...
    return new MyReturn <bool>();
}

在您的表单中,选中Message,如果为null或为空,则没有错误...。 您可以自定义它...

答案 1 :(得分:0)

根据非正式协议,每当您使用TryXXXX模式时,您的方法必须始终成功,但是将实际成功结果返回为布尔值。如果要抛出异常,则只需从方法名称中删除“ try”一词即可。

在顶部,如果您遵循TryXXXX模式,建议您添加一个try-catch块,以确保您的方法确实总是成功:

public bool TryAddService(Type type, object service)
{
  if (service == null)
  {
    return false;
  }

  if (this.services.ContainsKey(type))
  {
    return false;
  }

  if (!type.IsAssignableFrom(service.GetType()))
  {
    return false;
  }

  try
  {
    this.services.Add(type, service);
  }
  catch
  {
    return false;
  }

  return true;
}

答案 2 :(得分:0)

  

在这种情况下,我的客户将是其他开发人员。

您是否希望班级的使用者将有条件地注册类型?

if (TryAddService(typeof(IService), new Service1()))
{
    // Added successfully - what to do next
}
else
{
    // What here? Try another service?
}

否则,开发人员将只注册所需的实现,并依靠TryAddService在应用程序启动期间会引发异常的事实。

TryAddService(typeof(IService), new Service1());

作为开发人员,如果我做错了什么,我想尽快获得最快的反馈。在应用程序启动过程中(通常完成服务注册)抛出异常将是最快的反馈。除非您使用具有约束的泛型,否则泛型会在编译时提早提供反馈。

如果开发人员没有失败注册的逻辑,则不返回任何内容,而是使用描述性消息引发自定义异常

public void TryAddService(Type type, object service)
{
    if (service == null)
    {
        throw new RegisterServiceException($"Can not register null for type '{type.FullName}'");
    }

    if (this.services.ContainsKey(type))
    {
        throw new RegisterServiceException($"Service for type '{type.FullName}' already registerd.");
    }

    if (!type.IsAssignableFrom(service.GetType()))
    {
        throw new RegisterServiceException($"Type '{type.FullName}' should be assignable from service of type '{service.GetType().FullName}'");
    }

    this.services.Add(type, service);
}