2014-10-08 4 views
1

코드의 try catch 블록에서 예외를 catch하려고합니다. 잘못된 암호/파일과 같은 특정 오류 메시지가 있으며 오류가 발견되면 코드를 설정하려고합니다. 스위치를 사용하여 메시지를 잡으려고합니다. switch 문을 사용하여 메시지 캐치 시도

catch (Exception ex) 
      { 
    switch (ex.Message.ToString()) 
       { 
        case "Can't get attributes of file 'p'": 
         Debug.WriteLine("wrong username/password"); 
         MainController.Status = "2"; 
         break; 
        case "Can't get attributes of file 'p'.": 
         Debug.WriteLine("File is not Available"); 
         MainController.Status = "3"; 
         break; 

        default: 
         Debug.WriteLine("General FTP Error"); 
         MainController.Status = "4"; 
         break; 
       } 
} 

나는 내가 ex.message의 오류 메시지의 일부를 얻을 경우 다음이 관련 사건을 호출 할 수 있도록 message.contains 방법을 사용하고 싶지만 내가 예를 사용하는 방법을 알아낼 수 없습니다입니다

.message.contains. 누구든지 나를 도울 수 있습니까?

+1

만약'Contains'를 사용하고 싶다면'switch'를 포기하고 대신'if ... else'를 사용해야합니다. – jmcilhinney

답변

4

이 "마법 문자열"방식에 의존하기보다는 사용자 지정 예외 처리기를 사용하도록 코드를 리팩터링하는 것이 좋습니다. 이 접근법은 유지 보수가 어렵지 않고 테스트 및 디버그하기가 어렵습니다. 맞춤법 오류가 컴파일러에 의해 잡히지 않기 때문입니다. 그런 다음 개별적으로 예외를 잡을 수있을 것

// Note: can probably be better handled without using exceptions 
public class LoginFailedException : Exception 
{ 
    // ... 
} 

// Is this just a FileNotFound exception? 
public class FileNotAvailableException : Exception 
{ 
    // ... 
} 

public class FtpException : Exception 
{ 
    // ... 
} 

:

예를 들어, 다음과 같은 예외 처리기를 만들 수

try 
{ 
    // ... 
} 
catch (LoginFailedException) 
{ 
    Debug.WriteLine("wrong username/password"); 
    MainController.Status = "2"; 
} 
catch (FileNotAvailableException) 
{ 
    Debug.WriteLine("File is not Available"); 
    MainController.Status = "3"; 
} 
catch (FtpException) 
{ 
    Debug.WriteLine("General FTP Error"); 
    MainController.Status = "4"; 
} 

이 방식은 입력 안전, 당신을 수 있습니다 메서드를 쉽게 테스트하고 디버깅 할 수 있습니다. 또한 오타가 어려운 디버깅을 유발하는 것을 방지합니다.

+0

물론, 이것이 당신이 선호해야 할 것이지만, 프레임 워크 방법이 있다면 무엇입니까? (1) 소스가 발견되지 않았을 때, (2) 타겟이 이미 존재할 때, (3) 소스가 이미 사용중인 경우에 일반적인'IOException'을 throw하는'System.IO.File.Move'와 같습니다. 나는 예외 메시지를 비교할 수있는 선택의 여지가 없다는 두려움이있다. :( – KnorxThieus

1

그 대신에 Exception의 각 유형마다 별도의 catch 블록을 사용하십시오.