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블록 내에서는 해당 블록 내에서 선언된 변수만 초기화하십시오. 그렇지 않으면 블록의 실행이 완료되기 전에 예외가 발생할 수 있습니다. 예를 들어, 아래 코드 예제에서 변수x
는try블록 내에서 초기화됩니다.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();