2013-03-01 55 views
2

所以我有这样的方法:完成的方法与抛出异常,而不是返回

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 < (int.MaxValue - 1); i++)是一种可能的(即使只是理论的方式)的方式到达终点,也许还有更多的情况下,将导致返回任何结果之前到达方法的结束。然而,编译器会抱怨,如果没有return,但另一方面,如果代码到达方法的末尾,这意味着出现了问题,我希望能够正确处理这个问题。在开始时在本次检查

我的用户null

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

而且由于TI的绝对确定没有图像选择,我认为,我应该回到null结果的地方是这样的。其余的结果没有任何选择 - 当没有执行任何内容时,我会到达方法的结尾。正如我发布的return null;,但我需要改变它。我需要知道这种确切的情况正在发生,我需要做出相应的反应。

有,我能想到现在两个选择 - 返回一些字符串我检查或抛出异常。但我不确定 - 是否抛出异常而不是使用标准的return声明来完成方法。你认为处理这种情况的正确方法是什么?

+1

根据您的代码:如果每个建议的文件存在,比它不会返回任何东西。如果你是i> int.MaxValue,你可以抛出一个异常,因为超过2,147,483,646个同名的文件对我来说看起来是个例外。 – Silvermind 2013-03-01 11:50:59

回答

3

一般来说,在方法体的末尾可以确定throw(如“我们应该从未到过这一点”),但它有点不寻常。

在很明显,控制流可以方便地到达方法体结束这种特殊情况下 - 如果所有的File.Exists检查的成功,会出现这种情况。现在我和你“知道”这实际上是不可能的,但它不是数学上不可能的,这足以让编译器给出一个错误。

那么我们应该如何一个安抚这里的编译器?那么,任何方法有一个合同它运作。此方法的合约包括该方法将找到未使用的文件名,将源文件复制到那里并将路径返回给调用者。

然而有些东西在你的控制范围之外,可能会导致方法无法满足此合同,在这种情况下,你必须以某种方式与来电者沟通“我无法做到你所期望的我”。这不知何故是通过抛出一个异常。

+0

谢谢。顺便说一句,我修改了关于图像名称修改的答案,但将其留在我的''必须学会如何去做“库':) – Leron 2013-03-01 11:51:57

相关问题