프로그래머가 생각하는 시나리오에서 벗어나는 사건
예외가 프로그램의 오류나 다운으로 이루어지지 않도록 적절하게 처리하는 것
using System;
namespace KillingProgram
{
class MainApp
{
static void Main(string[] args)
{
int[] arr = {1, 2, 3};
for (int i = 0; i < 5; i++) // IndexOutOfRangeException => 프로그램 강제 종료
{
Console.WriteLine(arr[i]);
}
Console.WriteLine("종료");
}
}
}
try
{
// 실행하고자 하는 코드
}
catch( 예외_객체_1 ) // try블록에서 던질 예외 객체와 형식 일치
{
// 예외가 발생했을 때의 처리
}
catch( 예외_객체_2 )
{
// 예외가 발생했을 때의 처리
}
using System;
namespace TryCatch
{
class MainApp
{
static void Main(string[] args)
{
int[] arr = { 1, 2, 3 };
try
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine(arr[i]); // i=3 -> IndexOutOfRangeException 예외 발생
}
}
catch( IndexOutOfRangeException e ) // catch 블록이 위 예외 받아냄
{
Console.WriteLine($"예외가 발생했습니다 : {e.Message}");
}
Console.WriteLine("종료");
}
}
}
// 다음 2개의 예외 코드는
try
{
}
catch( IndexOutOfRangeException e )
{
//...
}
catch( DivideByZeroException e )
{
//...
}
// 아래의 하나의 catch절로 처리할 수 있다.
try
{
}
catch( Exception e )
{
//...
}
throw
문을 이용해 던지고 catch
문을 통해 받는다.using System;
namespace Throw
{
class MainApp
{
static void DoSomething(int arg)
{
if (arg < 10)
Console.WriteLine($"arg : {arg}");
else
throw new Exception("arg가 10보다 큽니다.");
}
static void Main(string[] args)
{
try
{
DoSomething(1);
DoSomething(3);
DoSomething(5);
DoSomething(9);
DoSomething(11); // 예외 발생
DoSomething(13); // 위 예외 발생으로 인해 코드 실행X
}
catch (Exception e) // 위 예외 발생 함수의 throw문이 던진 예외 객체를 catch가 받아냄
{
Console.WriteLine(e.Message);
}
}
}
}
throw
를 식(expression)으로도 사용할 수 있다.using System;
namespace ThrowExpression
{
class MainApp
{
static void Main(string[] args)
{
try
{
int? a = null;
int b = a ?? throw new ArgumentNullException();
}
catch (ArgumentNullException e)
{
Console.WriteLine(e);
}
try
{
int[] array = new[] { 1, 2, 3 };
int index = 4;
int value = array[
index >= 0 && index < 3
? index : throw new IndexOutOfRangeException()
];
}
catch (IndexOutOfRangeException e)
{
Console.WriteLine(e);
}
}
}
}
using System;
namespace Finally
{
class MainApp
{
static int Divide(int divisor, int dividend)
{
try
{
Console.WriteLine("Divide() 시작");
return divisor / dividend;
}
catch (DivideByZeroException e)
{
Console.WriteLine("Divide() 예외 발생");
throw e;
}
finally // 위에서 return하든지 throw를 하든지 무조건 실행하는 절
{
Console.WriteLine("Divide() 끝");
}
}
static void Main(string[] args)
{
try
{
Console.Write("제수를 입력하세요. :");
String temp = Console.ReadLine();
int divisor = Convert.ToInt32(temp);
Console.Write("피제수를 입력하세요. : ");
temp = Console.ReadLine();
int dividend = Convert.ToInt32(temp);
Console.WriteLine("{0}/{1} = {2}",
divisor, dividend, Divide(divisor, dividend));
}
catch (FormatException e)
{
Console.WriteLine("에러 : " + e.Message);
}
catch (DivideByZeroException e)
{
Console.WriteLine("에러 : " + e.Message);
}
finally // 무조건 실행
{
Console.WriteLine("프로그램을 종료합니다.");
}
}
}
}
using System;
namespace MyException
{
class InvalidArgumentException : Exception // Exception 상속
{
public InvalidArgumentException()
{
}
public InvalidArgumentException(string message)
: base(message)
{
}
public object Argument
{
get;
set;
}
public string Range
{
get;
set;
}
}
class MainApp
{
static uint MergeARGB(uint alpha, uint red, uint green, uint blue)
{
uint[] args = new uint[] { alpha, red, green, blue };
foreach (uint arg in args)
{
if (arg > 255)
throw new InvalidArgumentException()
{
Argument = arg,
Range = "0~255"
};
}
return (alpha << 24 & 0xFF000000) |
(red << 16 & 0x00FF0000) |
(green << 8 & 0x0000FF00) |
(blue & 0x000000FF);
}
static void Main(string[] args)
{
try
{
Console.WriteLine("0x{0:X}", MergeARGB(255, 111, 111, 111));
Console.WriteLine("0x{0:X}", MergeARGB(1, 65, 192, 128));
Console.WriteLine("0x{0:X}", MergeARGB(0, 255, 255, 300));
}
catch (InvalidArgumentException e)
{
Console.WriteLine(e.Message);
Console.WriteLine($"Argument:{e.Argument}, Range:{e.Range}");
}
}
}
}
catch()
절 뒤에 when
키워드 이용using System;
namespace ExceptionFiltering
{
class FilterableException : Exception
{
public int ErrorNo {get;set;}
}
class MainApp
{
static void Main(string[] args)
{
Console.WriteLine("Enter Number Between 0~10");
string input = Console.ReadLine();
try
{
int num = Int32.Parse(input);
if (num < 0 || num > 10)
throw new FilterableException() { ErrorNo = num };
else
Console.WriteLine($"Output : {num}");
}
catch (FilterableException e) when (e.ErrorNo < 0) // 예외 객체의 ErrorNo가 0보다 작을 경우 catch
{
Console.WriteLine("Negative input is not allowed.");
}
catch(FilterableException e) when (e.ErrorNo > 10) // 예외 객체의 ErrorNo가 10보다 클 경우 catch
{
Console.WriteLine("Too big number is not allowed.");
}
}
}
}
using System;
namespace Ex12_1
{
class MainApp
{
static void Main(string[] args)
{
int[] arr = new int[10];
for(int i=0; i<10; i++)
arr[i] = i;
try
{
for(int i=0; i<11; i++)
Console.WriteLine(arr[i]);
}
catch (IndexOutOfRangeException e)
{
Console.WriteLine(e)
}
}
}
}