【问题标题】:Finish a method with throwing exception rather than return完成一个抛出异常而不是返回的方法
【发布时间】:2013-03-01 11:41:20
【问题描述】:

所以我有这个方法:

public string SaveImage(AppConfig imagePath, string ImageNameFilter)
{
    if (selectedFileName == null)
    {
        return null;//No image is selected - return
    }
    string imgPath = imagePath.ConfigValue.ToString();
    string baseFileName = Path.GetFileNameWithoutExtension(selectedFileName);
    string extension = Path.GetExtension(selectedFileName);

    string temp = Path.GetFileNameWithoutExtension(selectedFileName);

    if (!baseFileName.StartsWith(ImageNameFilter))
    {
        throw new InvalidImageException("The image name must starts with  " + ImageNameFilter);
    }
    else
    {
        for (int i = 1; i < (int.MaxValue - 1); i++)
        {
            if (File.Exists(imgPath + "\\" + baseFileName + extension))
            {
                baseFileName = temp;
            }
            else
            {
                File.Copy(selectedFile, imgPath + "\\" + baseFileName + extension);
                return (baseFileName + extension);
            }
            baseFileName += (i).ToString();
        }
    }

    //throw new InvalidImageException("The Image was not saved");
    return null;//Should never come here - something went wrong
}

问题是该方法在最后等待返回,即使我认为我正在处理所有可能的结果。现在我看到,事实上for (int i = 1; i &lt; (int.MaxValue - 1); i++) 是一种可能的方法(尽管主要是理论上的方法)到达终点,也许有更多的情况会导致在返回任何结果之前到达方法的终点。但是,如果没有return,编译器会抱怨,但另一方面,如果代码到达方法的末尾,这意味着有问题,我希望能够正确处理。

我在此检查开始时使用null

if (selectedFileName == null)
{
    return null;//No image is selected - return
}

而且因为没有选择图像绝对可以,我认为我应该返回null 结果的地方就是这个。这使得其他结果几乎没有选择 - 当没有执行任何操作并且我到达方法的末尾时。正如发布的那样,我再次return null;,但我需要更改它。我需要知道这个确切的场景正在发生,我需要做出相应的反应。

我现在可以想到两个选项 - 返回一些我检查的字符串或抛出异常。但我不确定 - 这是一种通过抛出异常而不是使用标准 return 语句来完成方法的正确方法。您认为处理此案的正确方法是什么?

【问题讨论】:

  • 根据您的代码:如果每个建议的文件都存在,那么它将永远不会返回任何内容。如果你是 i > int.MaxValue,你可能会抛出异常,因为超过 2,147,483,646 个同名文件对我来说似乎是一个异常。

标签: c# error-handling


【解决方案1】:

一般来说,throw 在方法体的末尾是可以的(如“我们本不应该达到这一点”),但这有点不寻常。

在这种特定情况下,很明显控制流很容易到达方法体的末尾——如果所有File.Exists 检查都成功,就会发生这种情况。现在我和你“知道”这实际上是不可能的,但在数学上并非不可能,这足以让编译器给出错误。

那么这里应该如何安抚编译器呢?好吧,任何方法都有一个契约,它在它的基础上运行。该方法的约定包括该方法将找到一个未使用的文件名,将源文件复制到那里并将路径返回给调用者。

但是,有些事情超出了您的控制范围,可能会导致该方法无法满足此合同,在这种情况下,您必须以某种方式与调用者沟通“我无法按照您的预期去做”。这在某种程度上是通过抛出异常来实现的。

【讨论】:

  • 谢谢。顺便说一句,我修改了您关于图像名称修改的答案,但将其保留在我的 "Must learn how to do it" 存储库中:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多