본문스크랩 예외 처리문 (try-catch)


try-catch 문은 뒤에 하나 이상의catch절을 수반하는try블록으로 구성됩니다. 각catch절은 서로 다른 예외의 처리기를 지정합니다. 다음과 같은 형식 중 하나를 사용합니다.

 

trytry-block
catch (exception-declaration-1)catch-block-1
catch (exception-declaration-2)catch-block-2

trytry-blockcatchcatch-block

 

다음은 각 문자에 대한 설명입니다.

try-block : 예외가 발생할 수 있는 코드 세그먼트를 포함합니다.

exception-declaration, exception-declaration-1, exception-declaration-2 : 예외 개체 선언입니다.

catch-block, catch-block-1, catch-block-2 : 예외 처리기를 포함합니다.

 

try-block은 예외가 발생할 수 있는 보호된 코드 블록을 포함합니다. 이 블록은 예외가 throw되거나 성공적으로 완료될 때까지 실행됩니다. 예를 들어, 아래 예제의 경우null개체를 캐스팅하면NullReferenceException예외가 발생합니다.

object o2 = null; try { int i2 = (int) o2; // Error }

catch절은 인수 없이 사용할 수 있습니다. 이 경우catch절은 모든 예외 형식을 catch하며 일반 catch 절로 간주됩니다. 또한 이 절은System.Exception에서 파생된 개체 인수를 사용할 수 있습니다. 이 경우catch절은 특정 예외를 처리합니다. 예를 들면 다음과 같습니다.

catch (InvalidCastException e) { }

같은 try-catch 문에서 여러 개의 특정catch절을 사용할 수 있습니다. 이 경우catch절은 순서대로 검사되기 때문에catch절의 순서가 중요합니다. 보다 구체적인 예외를 먼저 catch하십시오.

throw문을catch블록에 사용하여catch문에서 catch한 예외를 다시 throw할 수도 있습니다. 예를 들면 다음과 같습니다.

catch (InvalidCastException e) { throw (e); // Rethrowing exception e }

현재 매개 변수가 없는catch절로 처리된 예외를 다시 throw하려면 인수 없이throw문을 사용합니다. 예를 들면 다음과 같습니다.

catch { throw; }

try블록 내에서는 해당 블록 내에서 선언된 변수만 초기화하십시오. 그렇지 않으면 블록의 실행이 완료되기 전에 예외가 발생할 수 있습니다. 예를 들어, 아래 코드 예제에서 변수xtry블록 내에서 초기화됩니다.Write(x)문의try블록 외부에서 이 변수를 사용하려고 하면할당되지 않은 지역 변수를 사용했습니다컴파일 오류가 발생합니다.

public static void Main()
{
   int x;
   try
   {
      x = 123;   //   Don’t do that.
      // …
   }
   catch
   {
      // …
   }
   Console.Write(x);   // Error: Use of unassigned local variable ‘x’.
}

catch에 대한 자세한 내용은try-catch-finally를 참조하십시오.

 

 

예제 1

아래 예제의try블록에는 예외를 발생시킬 수 있는MyFn()메서드 호출이 있습니다.catch절은 단순히 화면에 메시지를 표시하는 예외 처리기를 포함합니다.MyFn()내부에서throw문이 호출되면 시스템에서catch문을 찾아Exception caught메시지를 표시합니다.

// Rethrowing exceptions:
using System;
class MyClass
{
   public static void Main()
   {
      MyClass x = new MyClass();
      try
      {
         string s = null;
         x.MyFn(s);
      }
      catch (Exception e)
      {
         Console.WriteLine("{0} Exception caught.", e);
      }
   }
   public void MyFn(string s)
   {
      if (s == null)
         throw(new ArgumentNullException());
   }  
}

 

예제 2

아래 예제에서는 두 개의 catch 문을 사용합니다. 앞에 나오는 더 구체적인 예외가 catch됩니다.

// Ordering catch clauses
using System;
class MyClass
{
   public static void Main()
   {
      MyClass x = new MyClass();
      try
      {
         string s = null;
         x.MyFn(s);
      }
      // Most specific:
      catch (ArgumentNullException e)
      {
         Console.WriteLine("{0} First exception caught.", e);
      }
      // Least specific:
      catch (Exception e)
      {
         Console.WriteLine("{0} Second exception caught.", e);
      }
   }
   public void MyFn(string s)
   {
      if (s == null)
         throw new ArgumentNullException();
   }  
}

 

 

앞의 예제에서 가장 구체적이지 않은 catch 절을 사용하여 시작하면 아래와 같은 오류 메시지가 나타납니다.

A previous catch clause already catches all exceptions of this or a super type (‘System.Exception’)

하지만 throw 문을 아래와 같은 형식으로 바꾸면 가장 구체적이지 않은 예외를 catch할 수 있습니다.

throw new Exception();

 


답글 남기기

이메일 주소는 공개되지 않습니다.