2013-03-01 97 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