2013-11-14 7 views
0

을 잡기 위해 어떤 특정 예외를 알고하는 방법을예를 들어

try 
{ 
    Application.Exit(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
    //throw; 
} 

이 일반적인 예외입니다. 어느 것이 언제 사용되는지 어떻게 알 수 있습니까? 당신이 당신의 try 블록에 무엇을하려는 지에 따라 달라집니다

+1

* 당신 *이 어떤 이유로 든 그들을 양육하지 않으면 확실히 알 수 없습니다. – Tigran

+1

결코 그런 예외를 잡지 않습니다. Application.Exit() 실패는 올바르게 처리 할 수없는 조건입니다. –

답변

4

How to know wich one to use and when ?

. SqlCommand을 사용하여 일부 레코드를 검색 한 다음 SqlException을 먼저 catch 한 다음 다른 레코드를 수신하려면 Exception을 먼저 catch하는 것이 좋습니다.

try 
{ 
    using(SqlCommand cmd = new SqlCommand(....)) 
    { 
     //........ 
    } 
} 
catch (SqlException se) 
{ 
    //logging etc. 
} 
catch (Exception ex) 
{ 
    //logging etc 
} 

그냥 특정 첫째 예외 기본 Exception로의 이동을 잡으려고 기억한다. 멀리까지 잡으려고 어떤 예외에 대한 귀하의 질문으로, 그들에 대해 확실하지 않을 수 있습니다 그 이유는 그들이 예외라고, 당신은 예측하고 그에 따라 잡을 수 있습니다.

+1

@Downvoter, 게시물을 개선 할 수 있다면 기꺼이 될 것입니다. – Habib

+0

downvoter가 아니지만 대부분의 사람들이 메서드에 대한 설명서를 읽음으로써 어떤 예외를 잡을 지 결정할 수 있다고 말하면서 향상시킬 수 있습니다) 그들이 부르고있는. 나는 누군가가 실제로이 친구의 질문에 대답했다고 확신하지는 않는다. 그러나 주로 나는 그가 그것을 잘 표현했는지 확신 할 수 없다. – trope

+0

즉, 나는 그의 문제가 그가 SqlException이 존재하는지, 자신의 메서드 호출이 던져 질 수 있는지, SqlException이 잡히는 유효한 예외로 존재 하는지를 배우는 방법을 알지 못한다고 믿는다. catch 블록을 구조화하는 방법을 이해하지 못합니다. 나는 여기에서 틀릴 수있다, 그러나 그것은 나가 원래 질문을 읽는 방법이다. 또한 둘의 조합 일 수도 있습니다. – trope

0

많은 catch 블록을 정의 할 수 있습니다. Like :

 try 
     { 
      var result = 8/0; 
     } 
     catch (DivideByZeroException ex) 
     { 
      // Here, a more specific exception is caught. 
     } 
     catch (Exception ex) 
     { 
      // Otherwise, you'll get the exception here. 
     } 
0

구조화 된 예외 처리 (SEH)를 사용하고 싶습니다.

오류의 3 개 종류가 존재 당신이주의하는 것이 반드시 모두의

첫째 : C#에서 SEH를 사용하는

그래서 당신이해야

  • programm에 오류
  • 사용자 오류
  • 예외를 예외 상황을 만들 수있는 상황에 처하지만 프로그래머가 실행되는 동안 코드를 작성할 필요가 없습니다. 메서드를 만드는 동안 메서드가 요청한 작업을 수행 할 수없는 상황을 피하기 위해 메서드를 사용하는 경우 예외를 두어야합니다. 그리고이 과정에서 당신은 2 개의 주요 포인트 (리터 그의 책 중 하나를 써주세요)를 참고해야합니다 :

    우선 무엇이 예외 유형을 만들 수 있는지 이해해야합니다. 이 유형은 매우 신중하게 선택해야합니다.이 목적을 위해 FCL (Framework Class Library)에서 기존 유형 중 하나를 사용할 수 있지만, 예외 유형을 요구할 때 이러한 상황이 발생할 수 있습니다. 예를 들어 Input-Otput 클래스로 작업하는 경우 다음 예외 유형 중 하나를 사용할 수 있습니다 - System.IO.DirectoryNotFoundException, System.IO.DriveNotFoundException, System.IO.EndOfStreamException, System.IO.FileLoadException, System.IO.FileNotFoundException, System.IO.PathTooLongException, System.IO.PipeException.

    둘째, 예외 생성자로 보내지는 메시지를 선택해야합니다. 즉,이 예외가 언제 그리고 왜 만들어 졌는지, 메소드에서 자세한 정보를 찾을 수 있어야한다는 의미입니다.

    또한 예외를 만드는 당신은 ExceptionType1을 포함해야 EXCEPTIONExceptionType2ExceptionType1ExceptionType2을 포함해야 함을 유의하시기 바랍니다 다음 shablon 또한

    void SomeMEthod(){ 
    try 
    { 
        //your code to do 
    } 
    catch (ExceptionType1) //here put code with Exception 1 
    { 
    // you can add some specific code here for working with your exception 
    } 
    catch (ExceptionType2) //here put code with Exception 2 
    { 
    // you can add some specific code here for working with your exception 
    } 
    catch (EXCEPTION) //here put code with rest types of Exception 
    { 
    // you can add some specific code here for working with your exception 
    } 
    finally 
    { 
    //here put code that allow you to free your resourses 
    //NOTE: this code will be launched always! 
    } 
    //here you can placed code, that will be launched if no Exception will be found 
    } 
    

    을 사용할 수 있습니다 - 그렇지 - -이 일부 hierarhy를 사용하여 예외를 잡을 수 EXCEPTION을 모든 예외를 잡을 것입니다.

    또한 당신은 당신의 catch 블록에 키워드를 thow를 추가 할 수 있습니다 - 이중 작업을 위해 기존의 예외 당신이 예외를 잡기위한 코드를 사용하는 경우 이해하는 것이 반드시 또한

    catch (EXCEPTION) //here put code with rest types of Exception 
    { 
    // you can add some specific code here for working with your exception 
    throw; 
    } 
    

    로 - 당신이 할 수 있다는 것을 알고. 그래서 당신은 그것을 빼앗을 무언가를 만들 수 있습니다. 당신은 그런 식으로 코드를 만들어야합니다. 즉, try-catch-funally을 가진 블록들의 q-ty는 프로그래머가 요구하는 것입니다.

    C#의 예외 클래스에 대한 자세한 정보는 HERE입니다.