방법: Catch 블록에 특정 예외 사용
발생한 예외는 스택으로 전달되므로 각 catch 블록은 예외를 처리할 수 있게 됩니다. catch 문의 순서는 중요합니다. 일반적인 예외 catch 블록 앞에 특정 예외를 대상으로 하는 catch 블록을 지정하지 않으면 컴파일러에서 오류가 발생할 수 있습니다. 적합한 catch 블록이 결정되는 방식은 예외 유형을 catch 블록에 지정된 예외의 이름과 대응시키는 것입니다. 특정 catch 블록이 없으면 예외는 일반적인 catch 블록(있는 경우)에 의해 catch됩니다.
다음 코드 예제에서는 try/catch 블록을 사용하여 InvalidCastException을 catch합니다. 이 예제에서는 직급(Emlevel) 속성 하나만을 가지는 Employee라는 클래스를 만듭니다. PromoteEmployee 메서드는 개체를 받아서 직급을 증가시킵니다. DateTime 인스턴스가 PromoteEmployee 메서드로 전달되면 InvalidCastException이 발생합니다.
예제
Imports System
Public Class Employee
'Create employee level property.
Public Property Emlevel As Integer
Get
Return emlevelValue
End Get
Set
emlevelValue = Value
End Set
End Property
Private emlevelValue As Integer = 0
End Class
Public Class Ex13
Public Shared Sub PromoteEmployee(emp As Object)
'Cast object to Employee.
Dim e As Employee = CType(emp, Employee)
' Increment employee level.
e.Emlevel = e.Emlevel + 1
End Sub
Public Shared Sub Main()
Try
Dim o As Object = New Employee()
Dim newyears As New DateTime(2001, 1, 1)
'Promote the new employee.
PromoteEmployee(o)
'Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
PromoteEmployee(newyears)
Catch e As InvalidCastException
Console.WriteLine("Error passing data to PromoteEmployee method. " + e.Message)
End Try
End Sub
End Class
using System;
public class Employee
{
//Create employee level property.
public int Emlevel
{
get
{
return(emlevel);
}
set
{
emlevel = value;
}
}
private int emlevel = 0;
}
public class Ex13
{
public static void PromoteEmployee(Object emp)
{
//Cast object to Employee.
Employee e = (Employee) emp;
// Increment employee level.
e.Emlevel = e.Emlevel + 1;
}
public static void Main()
{
try
{
Object o = new Employee();
DateTime newyears = new DateTime(2001, 1, 1);
//Promote the new employee.
PromoteEmployee(o);
//Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
PromoteEmployee(newyears);
}
catch (InvalidCastException e)
{
Console.WriteLine("Error passing data to PromoteEmployee method. " + e.Message);
}
}
}
using namespace System;
public ref class Employee
{
public:
Employee()
{
emlevel = 0;
}
//Create employee level property.
property int Emlevel
{
int get()
{
return emlevel;
}
void set(int value)
{
emlevel = value;
}
}
private:
int emlevel;
};
public ref class Ex13
{
public:
static void PromoteEmployee(Object^ emp)
{
//Cast object to Employee.
Employee^ e = (Employee^) emp;
// Increment employee level.
e->Emlevel++;
}
static void Main()
{
try
{
Object^ o = gcnew Employee();
DateTime^ newyears = gcnew DateTime(2001, 1, 1);
//Promote the new employee.
PromoteEmployee(o);
//Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
PromoteEmployee(newyears);
}
catch (InvalidCastException^ e)
{
Console::WriteLine("Error passing data to PromoteEmployee method. " + e->Message);
}
}
};
int main()
{
Ex13::Main();
}
공용 언어 런타임에서는 catch 블록으로 catch되지 않는 예외를 catch합니다. 런타임의 구성 상태에 따라 디버그 대화 상자가 나타나거나 프로그램 실행이 중단되고 예외 정보가 표시된 대화 상자가 나타납니다. 디버깅에 대한 자세한 내용은 응용 프로그램 디버깅 및 프로파일링을 참조하십시오.
참고 항목
작업
방법: Try/Catch 블록을 사용하여 예외 catch