배열의 범위밖 인덱스 접근의 경우
static void Main(string[] args)
{
int[] arr = { 5, 3 , 53, 5353 };
Console.WriteLine(arr[535353]);
}
예외가 발생하지 않도록 사전에 처리
static void Main(string[] args)
{
int[] arr = { 5, 3 , 53, 5353 };
while (true)
{
string line = Console.ReadLine();
int idx = int.Parse(line);
// 입력 1 --> OUT : 3
// 입력 5 --> Invalid index
if (idx >= 0 && idx < arr.Length)
Console.WriteLine($"OUT : {arr[idx]}");
else
Console.WriteLine("Invalid index");
}
}
C#의 모든 에러클래스는 System.Exception
을 상속받는다.
CLR에 사전정의된 에러는 System.Exception
을 상속받는 System.SystemException
을 상속받는다.
사용자 에러는 기존에는 System.ApplicationException
을 상속받는 것이 일반적이었으나, 최근의 국룰은 System.Exception
을 바로 상속받는 것
try{} catch{}
패턴으로 사용한다.
finally{}
는 try문이 return되거나 catch가 실행된 경우에도 무조건 실행된다.
단, finally{}
안에서 return은 사용할 수 없다.
static void Main(string[] args)
{
int[] arr = { 5, 3 , 53, 5353 };
while (true)
{
try
{
Console.WriteLine("====================");
string line = Console.ReadLine();
int idx = int.Parse(line);
Console.WriteLine($"OUT : {arr[idx]}");
}
catch(IndexOutOfRangeException err)
{
Console.WriteLine($"Message : {err.Message}");
Console.WriteLine($"Source : {err.Source}");
Console.WriteLine($"StackTrace : {err.StackTrace}");
Console.WriteLine($"ToString() : {err.ToString()}");
}
catch (Exception err)
{
Console.WriteLine("Another Error Type");
Console.WriteLine(err);
}
finally
{
Console.WriteLine("----finally");
}
}
}
throw 문 아래와 같이 사용가능
while (true)
{
try
{
Console.WriteLine("====================");
string line = Console.ReadLine();
throw new Exception("I am Exception");
}
catch (Exception err)
{
Console.WriteLine("Another Error Type");
Console.WriteLine(err);
}
throw 식으로도 사용 가능 (삼항연산자에서 사용 등 가능)
System.Exception
을 상속한 클래스를 선언하고, 이 클래스의 객체를 생성해 throw한다.
static void Main(string[] args)
{
int[] arr = { 5, 3 , 53, 5353 };
while (true)
{
try
{
Console.WriteLine("====================");
string line = Console.ReadLine();
int n = int.Parse(line);
if (n <= 53)
throw new SmallValueException(n);
}
catch (SmallValueException err)
{
Console.WriteLine(err.Message);
Console.WriteLine(err);
}
catch (Exception err)
{
Console.WriteLine("All Error Type");
Console.WriteLine(err);
}
}
}
catch(Exception err) when (조건식)
과 같이 catch블록이 실행될 조건을 달아 예외를 필터링할 수 있음
static void Main(string[] args)
{
int[] arr = { 5, 3 , 53, 5353 };
while (true)
{
try
{
Console.WriteLine("====================");
string line = Console.ReadLine();
int n = int.Parse(line);
if (n <= 53)
throw new SmallValueException(n);
}
catch (SmallValueException err) when (err.isNegative())
{
Console.WriteLine("[ N E G A T I V E ]");
Console.WriteLine(err.Message);
Console.WriteLine(err);
}
catch (SmallValueException err) when (!err.isNegative())
{
Console.WriteLine("[ P O S I T I V E ]");
Console.WriteLine(err.Message);
Console.WriteLine(err);
}
catch (Exception err)
{
Console.WriteLine("All Error Type");
Console.WriteLine(err);
}
}
}