所以我有这个方法:
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
}
因为我没有选择图像,所以我认为我应该返回null
结果的地方就是这个。对于其他结果没有任何选择 - 当没有执行任何操作时,我到达方法的末尾。正如我再次发布return null;
,但我需要更改它。我需要知道这种确切的情况正在发生,我需要做出相应的反应。
我现在可以想到两个选项 - 返回一些我检查过的字符串或抛出异常。但我不确定 - 这是一种通过抛出异常而不是使用标准return
语句来完成方法的正确方法。您认为处理此案的正确方法是什么?
答案 0 :(得分:3)
一般来说,在方法体的末尾throw
可以是正常的(如“我们应该从未达到过这一点”),但这有点不寻常。
在这种特定情况下,很明显控制流很容易到达方法体的末端 - 如果所有File.Exists
检查都成功,就会发生这种情况。现在我和你“知道”这实际上是不可能的,但这在数学上是不可能的,这足以让编译器给出错误。
那么如何在这里安抚编译器呢?好吧,任何方法都有一个合同,在其下运作。此方法的合同包括该方法将找到一个未使用的文件名,在那里复制源文件并将路径返回给调用者。
但是,你控制之外的东西可能导致该方法无法满足此合同,在这种情况下,你必须以某种方式与呼叫者沟通“我无法按照你的意愿去做”。这不知怎的是抛出异常。