C# 我应该通过返回null或抛出自定义execption来处理开发人员失败吗

C# 我应该通过返回null或抛出自定义execption来处理开发人员失败吗,c#,.net,exception-handling,C#,.net,Exception Handling,当开发人员传递一个不存在的resourceKey时,我通过使用“as”操作符捕捉到他的失败 选项1: var image = resourceManager.GetObject(resourceKey) as Bitmap; return image; 选项2 var image = resourceManager.GetObject(resourceKey) as Bitmap 我是否应该在此处检查null并抛出自定义执行选项(“给定键的图像不存在!”) 我“假设”每个开发人员都

当开发人员传递一个不存在的resourceKey时,我通过使用“as”操作符捕捉到他的失败

选项1

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

var image = resourceManager.GetObject(resourceKey) as Bitmap
我是否应该在此处检查null并抛出自定义执行选项(“给定键的图像不存在!”)

我“假设”每个开发人员都测试自己的代码,因此将不存在的resourcekey作为字符串传递应该会导致GetObject方法调用出现异常

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


但我的同事们的看法不同……

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

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

该方法说的是
GetBitmap
,而不是
PleaseTryGetBitmap
FindBitmap
(find意味着可能找不到某些内容)。因此,该方法的契约明确规定,应该为给定名称获取位图。其他任何事情都是异常情况,因此应该抛出异常

因此,我建议为您的问题提供两种解决方案:

1。抛出异常并添加一个
来记录您的方法。

包括在引发的异常中失败的密钥。它使调试变得容易得多

/// <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;
}

没有回答您的问题,但我认为您应该先检查资源对象,然后再将其转换为
位图
。一种是不要将异常用于您可以以其他方式处理的事情,因为catch块是性能杀手。另一个是不使用异常作为流控制。Linvi的回答第二个选项对于这些情况是一个很好的解决方案。您可能希望将该方法重命名为
TryGetBitmap
或返回
Image
,而不是
Bitmap
添加了第一个示例+1:)我认为您应该在第一个示例中“返回位图;”
public bool TryGetBitmap(string resourceKey, out Bitmap bitmap)
{
    bitmap = resourceManager.GetObject(resourceKey) as Bitmap;
    return bitmap != null;
}