【问题标题】:Should I handle developer failure with returning null or throw custom execption我应该通过返回 null 来处理开发人员失败还是抛出自定义异常
【发布时间】:2016-08-04 07:27:03
【问题描述】:

当开发人员传递一个不存在的 resourceKey 时,我会使用 'as' 运算符发现他的失败

选项1

  var image = resourceManager.GetObject(resourceKey) as Bitmap;
   return image;

选项2

var image = resourceManager.GetObject(resourceKey) as Bitmap

我是否应该在这里检查空并抛出自定义执行(“给定键的图像不存在!”)

我“假设”每个开发人员都测试他的代码,因此将 不存在的资源键作为字符串传递应该会导致 GetObject-Method 调用出现异常。

当开发人员只返回 null 而没有显示任何内容时,他有什么好处?实际上没有任何好处。

但我的同事们意见不同...

【问题讨论】:

  • 没有回答你的问题,但我认为你应该先检查资源对象,然后再将其转换为Bitmap
  • 有一些黄金法则,但有例外。一种方法是不要对您可以处理的事情使用异常,因为 catch 块是性能杀手。另一种是不使用异常作为流控制。 Linvi 的回答第二个选项对于这些情况是一个很好的解决方案。

标签: c# .net exception-handling


【解决方案1】:

我在实施公共图书馆时遇到了同样的问题。

我认为通常最好确保开发人员知道他们在做什么。如果一个值可以为 null 或抛出异常,他需要注意这一点。

该方法说GetBitmap,它没有说PleaseTryGetBitmapFindBitmapfind 表示可能找不到某些东西)。因此,该方法的合同明确规定应该为给定名称获取位图。其他任何事情都是例外情况,因此应该抛出异常。

所以我会为您的问题提出 2 个解决方案:

1.抛出异常并添加<exception> 来记录您的方法。

在您抛出的异常中包含失败的键。它使调试变得容易得多。

/// <exception cref="ArgumentException"></exception>
public Bitmap GetBitmap(string resourceKey)
{
    var bitmap = resourceManager.GetObject(resourceKey) as Bitmap;
    if (bitmap == null) throw new ArgumentOutOfRangeException("resourceKey", resourceKey, "Failed to find resource with the specified name.");
    return bitmap != null;
}

2。使用tryGet 样式方法,如下所示。

这将强制开发人员检查该值是否确实存在并据此采取行动。

public bool TryGetBitmap(string resourceKey, out Bitmap bitmap)
{
    bitmap = resourceManager.GetObject(resourceKey) as Bitmap;
    return bitmap != null;
}

【讨论】:

  • 您可能希望将方法重命名TryGetBitmap 或返回Image 而不是Bitmap
  • 添加了第一个示例。 +1 :)
  • 我认为你应该“返回位图;”在你的第一个例子中
猜你喜欢
  • 2011-04-27
  • 1970-01-01
  • 2010-11-24
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2018-07-27
相关资源
最近更新 更多