2012-03-05 3 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); 

    } 
    } 

Amはデフォルトのswitch文を処理しますが、正しいことを確認していません。 switch文のデフォルトは基本的にすべての漁獲量(または何youreのあなたのcatchステートメントでやって)であるアドバンススイッチのデフォルトをどのように処理するかわかりませんか?

+6

あなたは 'default'節で何でもできます。何をしたいですか? – SLaks

+0

あなたの直面する問題は、あなたが 'null'を返すことであると思って、それを列挙しようとしています。 Anastasiosyalが示唆するようにそれらの場所を事前定義する異なる実装を提案してください。 –

+0

@ SLaks、位置が一致しない場合、私はプロセスを停止するか、単に私がキャッチを投げると言う。 – Usher

答えて

4

例外が発生すると予想されない場合にのみ、例外をスローする必要があります。 SRV01/02/03以外のディレクトリが予想されない場合は、例外をスローすると問題ありません。それが起こることを期待し、優雅にそれを処理したい場合は、例外をスローしないでください。

しかし、同じ機能でコンソールに投げて書き込んだ例外をキャッチすることは意味がありません。あなたはそこで例外を投げるという目的をすべて殺します。コンソールにエラーを書きたい場合は、デフォルトのステートメントで直接行うことができます。

GetFilesが例外をスローした場合のケースを処理する場合は、特に処理してください。例外をキャッチしてコンソールに書き込むことは意味がありません。あなたがそれをキャッチするなら、それはあなたがそれをどうするかを知っていることを意味します。あなたがしない場合、それをキャッチしないでください。

あなたのネットワークが死んでおり、GetFilesが発生したとします。IOExceptionあなたはそれを捕まえてヌルを返し、コードはNullReferenceExceptionに上がります。そのため、例外が発生した理由に関する情報が失われます。

ネットワーク接続が失われたらどうしますか?退出したいですか?それから、何もする必要はありません。未処理の例外はすでにあなたのために行います。あなたは走り続ける必要がありますか?本気ですか?アプリが正常に終了すると、「完了したすべての作業が完了しました」または「問題が発生した可能性がありますが、気にしない」という意味になりますか?エラーを "無視"して例外をキャッチし、通知して続行しても問題ないと確信できるならば、それは問題ありません。あなたの意図を確かめてください。例外は悪くも悪くもない。彼らは役に立つので、彼らはそこにいます。

+0

大きな助けと助言をいただき、ありがとうございます。 – Usher

1

感謝。あなたの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のコードとはあまり一致しません。 –

+0

おかげさまで@ Anastasiosyal、私も考えが好きです。 – Usher

0

オプションを使用すると、Intellisenseで表示される各可能性の利点を得ることができる場所の列挙を作成できます。私はさらに、同じメソッド(反パターン)内で自分自身をキャッチするために例外をスローしているという点で、Kevinが指摘したことに同意します。列挙型は私の唯一の提案です。そうでないと、デフォルトの理解と実装が正しい(つまり、予期しない/無効なケースをすべてキャッチする)ことができます。

関連する問題