블로그 이미지
Kanais
Researcher & Developer 퍼즐을 완성하려면 퍼즐 조각들을 하나 둘씩 맞춰나가야 한다. 인생의 퍼즐 조각들을 하나 둘씩 맞춰나가다 보면 인생이란 퍼즐도 완성되는 날이 오려나...?

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Notice

2015. 5. 19. 13:52 Programming/.NET

작성날짜    : 2011-03-30


출처 : http://msdn.microsoft.com/ko-kr/library/0yd65esw.aspx

 

try-catch

try-catch 문은 try 블록과 각각 다른 예외의 처리기를 지정하는 하나 이상의 catch 절로 구성됩니다. 예외가 throw될 경우 CLR(공용 언어 런타임)에서는 이 예외를 처리하는 catch 문을 찾습니다. 현재 실행되고 있는 메서드에 catch 블록이 없는 경우 CLR은 현재 메서드를 호출한 메서드를 찾는 방법으로 호출 스택을 조사합니다. catch 블록을 찾지 못하면 CLR은 사용자에게 처리되지 않은 예외 메시지를 표시하고 프로그램 실행을 중지합니다.

try 블록에는 예외를 발생시킬 수 있는 보호된 코드가 포함됩니다. 이 블록은 예외가 throw되거나 성공적으로 완료될 때까지 실행됩니다. 예를 들어, 다음 예제와 같이 null 개체를 캐스팅하려고 하면NullReferenceException예외가 발생합니다.

object o2 = null;

      try

      {

          int i2 = (int)o2;   // Error

      }

 

catch 절을 인수 없이 사용하여 모든 형식의 예외를 catch할 수 있지만 이러한 방법은 권장되지 않습니다. 일반적으로 복구할 수 있는 예외만 catch해야 합니다. 따라서 다음 예제와 같이 항상  System.Exception에서 파생된 개체 인수를 지정해야 합니다.

catch (InvalidCastException e)

{
}

같은 try-catch 문에서 여러 개의 특정 catch 절을 사용할 수 있습니다. catch 절은 순서대로 검사되므로 이런 경우에는 catch 절의 순서가 중요합니다. 보다 구체적인 예외를 먼저 catch하십시오. 나중에 블록 전혀 연결할 수 있도록 해당 catch 블록의 순서를 않으면 컴파일러에서 오류가 발생합니다.

Throw는 re-throw에 의해 발생한 예외 블록이 있는 catch문을 catch문으로 사용 될 수 있습니다. 다음은 원본 정보를 추출하는 에서 IOException, 예외 및 부모 메서드를. 예외를 throw하는 소스 코드 입니다.

catch (FileNotFoundException e)

{

    // FileNotFoundExceptions are handled here.

}

catch (IOException e)

{

    // Extract some information from this exception, and then

    // throw it to the parent method.

    if (e.Source != null)

        Console.WriteLine("IOException source: {0}", e.Source);

    throw;

}

 

한 가지 예외를 catch하고 다른 예외를 throw할 수 있습니다. 이렇게 하면 다음 예제와 같이 내부 예외로 발생한 예외를 지정하십시오.

catch (InvalidCastException e)

{

    // Perform some action here, and then throw a new exception.

    throw new YourCustomException("Put your error message here.", e);

}

 

지정한 조건이 참일 경우 다음 예제와 같을 때 예외가 re-throw될 수도 있습니다.

catch (InvalidCastException e)

{

    if (e.Data == null)

    {

        throw;

    }

    else

    {

        // Take some action.

    }

 }

 

안에 try차단, 여기에 선언된 변수를 초기화 합니다. 그렇지 않은 경우에는 블록 실행이 완료되기 전에 예외가 발생할 수 있습니다. 예를 들어 다음 코드 예제에서는 변수 n try 블록 내에서 초기화됩니다. Write(n) 문의 try 블록 외부에서 이 변수를 사용하려고 하면 컴파일러 오류가 발생합니다.

 

static void Main()

{

    int n;

    try

    {

        // Do not initialize this variable here.

        n = 123;

    }

    catch

    {

    }

    // Error: Use of unassigned local variable 'n'.

    Console.Write(n);

}

 

예제 소스

다음 예제에서는 try차단 호출이 포함되어 있는 ProcessString메서드가 있는 발생할 예외입니다. catch 절에는 단순히 화면에 메시지를 표시하는 예외 처리기가 포함되어 있습니다. MyMethod 내에서 throw 문이 호출되면 시스템에서 catch 문을 찾아 Exception caught라는 메시지를 표시합니다.

class TryFinallyTest

    {

        static void ProcessString(string s)

        {

            if (s == null)

            {

                throw new ArgumentNullException();

            }

        }

 

        static void Main()

        {

            string s = null// For demonstration purposes.

 

            try

            {

                ProcessString(s);

            }

            catch (Exception e)

            {

                Console.WriteLine("{0} Exception caught.", e);

            }

        }

    }

 

출력 결과

 

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

class ThrowTest2

    {

        static void ProcessString(string s)

        {

            if (s == null)

            {

                throw new ArgumentNullException();

            }

        }

 

        static void Main()

        {

            try

            {

                string s = null;

                ProcessString(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);

            }

        }

    }

 

출력 결과


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

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

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

throw new Exception();


'Programming > .NET' 카테고리의 다른 글

[.NET] legacy (레거시)  (0) 2015.05.19
[.NET] csc로 컴파일 하고 dll 생성하기  (0) 2015.05.19
[.NET] Serialize (직렬화)  (0) 2015.05.19
[.NET] Visual C# 2008 컴파일러 옵션  (0) 2015.05.19
[.NET] Assembly  (0) 2015.05.19
posted by Kanais