2012-03-05 47 views
0
class Program 
{ 
    static void Main(string[] args) 
    { 
     var getfiles = new fileshare.Program(); 

     string realname = "*test*"; 
     string Location = "SVR01"; 
     foreach (var file in getfiles.GetFileList(realname,Location)) 
     {getfiles.copytolocal(file.FullName); } 

     } 
    private FileInfo[] GetFileList(string pattern,string Location) 
    { 

     try 
     { 
      switch (Location) 
      { 
       case "SVR01": 
        { 
         var di = new DirectoryInfo(@"\\SVR01\Dev"); 
         return di.GetFiles(pattern); 
        } 
       case "SVR02": 
        { 
         var di = new DirectoryInfo(@"\\SVR02\Dev"); 
         return di.GetFiles(pattern); 
        } 
       case "SVR03": 
        { 
         var di = new DirectoryInfo(@"\\SVR03\Prod"); 
         return di.GetFiles(pattern); 
        } 
       default: throw new ArgumentOutOfRangeException(); 

      } 
     } 
     catch(Exception ex) 
     { Console.Write(ex.ToString()); 
     return null; 
     } 

    } 
    private void copytolocal(string filename) 
    { 
     string nameonly = Path.GetFileName(filename); 
     File.Copy(filename,Path.Combine(@"c:\",nameonly),true); 

    } 
    } 

我處理默認的開關語句,但不知道我是否做得對,有人請糾正我。我不確定如何處理交換機中的默認設置?

由於提前

+6

你可以在'default'子句中做任何你想做的事情。您想做什麼? – SLaks 2012-03-05 00:16:26

+0

我懷疑你的直接問題是你返回null,然後試圖枚舉。建議您按照Anastasiosyal的建議預先定義這些位置。 – 2012-03-05 00:25:48

+0

@ SLaks,如果沒有位置匹配,那麼我會停止這個過程,或者簡單地說我會拋出catch。 – Usher 2012-03-05 00:32:54

回答

4

只有在您不希望發生某些情況的情況下,才應該拋出異常。如果不期望SRV01/02/03以外的目錄,拋出異常就可以。如果你期望它發生並想要優雅地處理它,不要拋出異常。

但是捕獲你剛纔拋出的異常並將它寫入控制檯中的相同函數沒有任何意義。你殺了所有拋出異常的目的。如果您想向控制檯寫入錯誤,則可以直接在默認語句中執行此操作。

如果您想處理GetFiles引發異常的情況,請專門處理。捕獲異常並將其寫入控制檯沒有任何意義。如果你抓住它,這意味着你知道該怎麼做。如果你不這樣做,不要抓住它。

說你的網絡已經死亡,並且GetFiles增加了IOException。你抓住它並返回null,你的代碼將會增加NullReferenceException。因此,你失去了爲什麼會引發異常的信息。

如果網絡連接丟失,您想怎麼做?你想退出?那麼你不需要做任何事情,一個未處理的異常已經爲你做了。你需要繼續運行?你確定?如果應用程序成功退出,那麼它意味着「它已完成了它應該做的所有事情」或「可能有問題但您不在意」?如果你確定可以「忽略」錯誤,那麼趕上異常,通知並繼續,這很好。只要確定你的意圖。異常並不壞或邪惡。他們在那裏,因爲他們是有幫助的。

+0

非常感謝大家的幫助和建議。 – Usher 2012-03-05 02:34:09

1

在switch語句的默認基本上是一個包羅萬象的(或什麼是您選擇在您的catch語句做)。如果你的switch語句中出現了某些內容並觸發了默認值,那麼它可能會被抓到。我的建議,返回一個null並寫入控制檯,無論你的例外是什麼。如果您的例外有效,請保持原樣。就像@SLaks所說,你可以在你的默認子句中做任何你想做的事情,因爲它是一個catch語句的開關形式。

2

我看到你只需要檢查一個位置是否在允許的位置列表中。我不認爲開關是一個很好的候選人這樣的事情。它看起來更像是配置,也許下面的代碼可以讓你從配置文件中讀取這些值。此外,在每一個switch語句的邏輯是一樣的,所以如果我們能夠減少這種重複,這是一個獎金

private List<string> _allowedLocations 

public YourClassConstructor() 
{ 
    _allowedLocations = new List() 
    {@"\\SVR01\Dev", @"\\SVR02\Dev", @"\\SVR02\Dev"} 
} 

private FileInfo[] GetFileList(string pattern,string location) 
{ 
    if (location == null) 
     throw new ArgumentNullException("location"); 

    if (!_allowedLocations.Contains(location)) 
     throw new ArgumentOutOfRangeException("location"); 

    var di = new DirectoryInfo(location); 
    return di.GetFiles(pattern); 

} 
+0

我喜歡這個想法,但它不完全符合OP的代碼。 – 2012-03-05 00:41:21

+0

謝謝@ Anastasiosyal,即使我也喜歡這個主意。 – Usher 2012-03-05 02:33:38

0

如果它是隻爲你的網絡路徑的完全控制的內部環境,那麼你有選項爲位置進行枚舉,這將爲您提供Intellisense中顯示的每種可能性的優勢。我還同意凱文指出的,因爲你拋出的異常只是用相同的方法(反模式)來捕捉它。枚舉是我唯一的建議,否則你對默認的理解和實現是正確的(即捕獲所有意外/無效的情況)。