컴파일러에서 생성된 예외 검사
- 10분
예외는 .NET 런타임 또는 프로그램의 코드에 의해 생성됩니다. 예외 형식은 예외를 발생시키는 코드에 따라 달라집니다.
컴파일러 생성 예외
.NET 런타임은 기본 작업이 실패할 때 예외를 throw합니다. 다음은 런타임 예외 및 해당 오류 조건의 짧은 목록입니다.
ArrayTypeMismatchException: 요소의 실제 형식이 배열의 실제 형식과 호환되지 않으므로 배열에서 지정된 요소를 저장할 수 없을 때 throw됩니다.DivideByZeroException: 정수 값을 0으로 나누려고 시도할 경우 throw됩니다.FormatException: 인수 형식이 잘못되었을 때 throw됩니다.IndexOutOfRangeException: 인덱스가 0보다 작거나 배열 범위 밖에 있을 때 배열을 인덱싱하려고 할 때 throw됩니다.InvalidCastException: 런타임에 기본 형식에서 인터페이스 또는 파생 형식으로의 명시적 변환이 실패할 때 throw됩니다.NullReferenceException: 값이 null인 개체를 참조하려고 할 때 throw됩니다.OverflowException: 확인된 컨텍스트의 산술 연산이 오버플로될 경우 throw됩니다.
컴파일러 생성 예외에 대한 코드 샘플
다음 코드 샘플에서는 컴파일러에서 생성된 예외를 발생시키는 코드의 예를 보여 있습니다.
ArrayTypeMismatchException
배열 내에 잘못된 형식 ArrayTypeMismatchException 의 요소를 저장하려고 하면 형식 예외가 throw됩니다. 다음 예제에서는 문자열 배열에 ArrayTypeMismatchException 숫자 값을 저장하려고 할 때 예외를 throw합니다.
string[] names = { "Dog", "Cat", "Fish" };
Object[] objs = (Object[])names;
Object obj = (Object)13;
objs[2] = obj; // ArrayTypeMismatchException occurs
DivideByZeroException
정수 또는 10진수를 0으로 나누려고 할 때 형식 DivideByZeroException 예외가 발생합니다. 다음 예제는 정수 나누기를 수행할 때 DivideByZeroException 예외를 발생시킵니다.
int number1 = 3000;
int number2 = 0;
Console.WriteLine(number1 / number2); // DivideByZeroException occurs
비고
부동 소수점 값을 0으로 나누면 예외가 throw되지 않습니다. IEEE 754 산술 규칙에 따라 양의 무한대, 음의 무한대 또는 NaN(숫자가 아님)이 생성됩니다.
FormatException
형식 FormatException 의 예외는 인수의 형식이 유효하지 않거나 복합 형식 문자열이 잘 구성되지 않은 경우에 발생합니다. 다음 예제에서는 문자열을 FormatException 정수로 변환하려고 할 때 예외를 throw합니다.
int valueEntered;
string userValue = "two";
valueEntered = int.Parse(userValue); // FormatException occurs
인덱스 범위 초과 예외
범위 밖에 있는 인덱스를 사용하여 배열 또는 컬렉션의 요소에 액세스하려고 하면 형식 IndexOutOfRangeException 예외가 throw됩니다. 다음 예제는 IndexOutOfRangeException 배열의 마지막 요소를 values1 배열의 마지막 요소에 할당하려고 할 때 values2 예외를 던집니다.
int[] values1 = { 3, 6, 9, 12, 15, 18, 21 };
int[] values2 = new int[6];
values2[values1.Length - 1] = values1[values1.Length - 1]; // IndexOutOfRangeException occurs
InvalidCastException
잘못된 캐스팅 또는 명시적 변환을 시도할 때 타입InvalidCastException의 예외가 발생합니다. 다음 예에서는 문자열 형식의 InvalidCastException를 object 변수로 변환하려고 할 때 int 예외가 발생합니다.
object obj = "This is a string";
int num = (int)obj;
NullReferenceException
값이 null인 형식 NullReferenceException 의 멤버에 액세스하려고 하면 형식 예외가 throw됩니다. 두 가지 예제가 표시됩니다. 첫 번째 예제에서는 null 배열의 요소에 액세스하려고 할 때 NullReferenceException가 발생됩니다. 두 번째 예제에서는 null 문자열의 메서드에 액세스할 때 NullReferenceException 오류가 발생합니다.
int[] values = null;
for (int i = 0; i <= 9; i++)
values[i] = i * 2;
string? lowCaseString = null;
Console.WriteLine(lowCaseString.ToUpper());
OverflowException
산술 연산이 대상 데이터 형식 범위를 벗어난 결과를 할당하려고 할 때 형식 OverflowException 예외가 발생합니다. 다음 예제에서는 400의 OverflowException 값을 decimal 변수로 변환하려고 할 때 byte 예외를 발생시킵니다.
decimal x = 400;
byte i;
i = (byte)x; // OverflowException occurs
Console.WriteLine(i);
요약
이 단원에서 기억해야 하는 몇 가지 중요한 사항은 다음과 같습니다.
- .NET 런타임은 작업이 실패할 때 예외를 throw합니다.
- 예외 형식은 예외를 발생시키는 코드에 따라 달라집니다.
- 애플리케이션은 실행 시 예외를 포착해야 합니다.