2012-03-05 2 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 문을 처리하지만 올바르게 수행되고 있는지 확실하지 않습니다. 일부 수정하십시오. 스위치 문에서 기본값은 기본적으로 모든 캐치 (또는 무엇을 개봉하여 catch 문에 일을)은 사전스위치의 기본값을 처리하는 방법을 모르십니까?

+6

'default' 절에서 원하는대로 할 수 있습니다. 뭐하고 싶어? – SLaks

+0

당신의 즉각적인 문제는 당신이'널 (null) '을 반환한다는 것입니다. 그리고 그걸 열거하려고합니다. Anastasiosyal 제안에 따라 다른 위치를 미리 정의 할 수있는 다른 구현 방법을 제안하십시오. –

+0

@ SLaks, 위치가 일치하지 않으면 프로세스를 중지하거나 간단히 잡을 수 있다고 말합니다. – Usher

답변

4

예외가 발생할 것으로 예상되는 경우에만 예외를 throw해야합니다. SRV01/02/03 이외의 디렉토리가 예상되지 않는 경우 예외를 throw하는 것이 좋을 수 있습니다. 만약 당신이 그것을 기대하고 그것을 우아하게 처리하고 싶다면, 예외를 던지지 마십시오.

하지만 방금 던진 예외를 잡아서 같은 기능으로 콘솔에 쓰는 것은 의미가 없습니다. 거기에서 예외를 던지기위한 모든 목적을 죽이십시오. 콘솔에 오류를 기록하려면 기본 명령문에서 오류를 직접 수행 할 수 있습니다.

GetFiles이 예외를 throw 할 때 케이스를 처리하려면 특별히 처리해야합니다. 예외를 잡아서 콘솔에 쓰는 것은 의미가 없습니다. 당신이 그것을 붙잡는다면, 당신은 그것을 어떻게 해야할지를 아는 것입니다. 당신이 그것을하지 않으면, 그것을 잡지 마십시오.

네트워크가 작동하지 않으며 GetFiles이 (가) IOException으로 늘어났습니다. 그것을 잡아서 null을 반환하면 코드는 NullReferenceException으로 올립니다. 따라서 예외가 발생한 이유에 대한 정보를 잃게됩니다.

네트워크 연결이 끊어진 경우 수행 할 작업은 무엇입니까? 나갈거야? 그렇다면 아무 것도 할 필요가 없습니다. 처리되지 않은 예외는 이미 여러분을 위해 그것을합니다. 계속 달리야합니까? 확실합니까? 응용 프로그램이 성공적으로 종료되면 "처리해야 할 모든 작업을 완료했습니다"또는 "문제가 있었지만 상관하지 않을 수 있음"을 의미합니까? 오류를 "무시"한 다음 예외를 잡아 내고 알리고 계속하면 괜찮습니다. 괜찮습니다. 당신의 의도를 확인하십시오. 예외는 나쁘지도 악하지도 않습니다. 그들은 도움이되기 때문에 거기에 있습니다.

+0

큰 도움과 제안에 감사드립니다. – Usher

1

감사합니다. 스위치 문에 무언가가 들어서 기본값을 치면 캐치에 영향을 미칠 수 있습니다. 내 제안, null을 반환하고 귀하의 예외가 무엇이든 콘솔에 씁니다. 예외가 작동하면 그대로 두십시오. @SLaks가 말했듯이, catch 절의 스위치 형태이기 때문에 기본 절에서 원하는 모든 것을 할 수 있습니다.

2

위치가 허용되는 위치 목록에 있는지 간단히 확인해야합니다. 나는 스위치가 이런 식의 좋은 후보라고 생각하지 않는다. 구성과 비슷해 보입니다. 다음 줄에있는 내용은 예를 들어 구성 파일에서 이러한 값을 읽을 수있게 해줍니다. 또한 각 스위치 문에서 논리가 동일합니다, 그래서 우리는이 반복을 최소화 할 수 있습니다 경우가 네트워크 경로의 모든 권한을 내부 환경 만 있다면, 그것은 보너스를

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이 지적한 것에 동의합니다. 동일한 메소드 (반 패턴) 내에서 예외를 던져 버리는 것입니다. 열거 형은 나의 유일한 제안입니다. 그렇지 않으면 사용자의 이해 및 구현이 정확합니다 (예기치 못한 모든 사례를 잡기 위해).

관련 문제