본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 37. 예외처리

예외처리는 예외 상황을 처리하는것이다.

static void Main(string[] args)
{
int a;
int b;
a = Int32.Parse(Console.ReadLine());
b = Int32.Parse(Console.ReadLine());

Console.WriteLine(a/b);
}


a,b를 입력받고

a/b를하는 프로그램이다.


여기서 b가 0이라면 a/b를 할수없다

static void Main(string[] args)
{
int a;
int b;
a = Int32.Parse(Console.ReadLine());
b = Int32.Parse(Console.ReadLine());

if (b != 0)
{
Console.WriteLine(a / b);
}
}

따라서

이런식으로 if문으로 예외처리를 해줘야 한다.


이렇게 간단한 예외는 if문으로 해줘도 프로그램만 잘동작하면 문제가 없긴하나..

예외상황이 많아지면 if문 지옥이 되버리고 각 if문에서도 처리해야될 내용이 많아지게된다.


1.try-catch

따라서 거의 대부분의 프로그래밍 언어는 예외처리를위한 특수한 구문 try-catch 구문을 지원한다.

구문이다.


class MyException : Exception
{
public MyException(string message) : base(message)
{
}
}

class Program
{
static void Main(string[] args)
{
try
{
int a;
int b;
a = Int32.Parse(Console.ReadLine());
b = Int32.Parse(Console.ReadLine());

if (b == 0)
{
throw new MyException("0으로 나눌수없어요~");
}

Console.WriteLine(a / b);
}
catch (MyException e)
{
Console.WriteLine(e.Message);
}

}
}

C#에서는 기본적으로 throw 를 exception 객체 밖에 할수없다.


try구문은 예외처리가 동작할 구문이다.

catch 구문은 throw된 예외를 잡아서 처리하는 구문이다.

throw는 예외 객체를 던지는 구문이다.


위에는 0으로 나누려고 하면 MyException을 던지고 이를 캐치에서 받아서 처리하는 구문이다.


try구문에서 throw가발생하면 아래를 실행하지 않고 catch로 넘어간다.



2.기본 제공 Exception

예외처리를 안하고 돌리면

이라는 문자가 콘솔창에 나타난다.

문자그대로 처리되지 않은 예외가 있다는건데

저뜻은 예외가 throw 됬는데 catch를 안했다는 소리다.

저렇게 나는 만든적도 없는 예외 (DivideByZero) 가 이미 있다.


static void Main(string[] args)
{
try
{

int a;
int b;
a = Int32.Parse(Console.ReadLine());
b = Int32.Parse(Console.ReadLine());

Console.WriteLine(a / b);

}
catch (DivideByZeroException e)
{
Console.WriteLine(e.Message);
}

}

따라서 이미 있는 예외라면 굳이 내가 만들필요없이 걍 catch만 하면된다.


3.스택 되감기

위의 코드로 try-catch를 했는데

아니 아무리봐도 걍 if문으로 검사해서 실행하는게 더 짧고 심플해보인다.


아까도 말했듯이..

이렇게 간단한 예외는 if문으로 해줘도 프로그램만 잘동작하면 문제가 없긴하나..

예외상황이 많아지면 if문 지옥이 되버리고 각 if문에서도 처리해야될 내용이 많아지게된다.


그리고 try-catch는 스택되감기라는것을 지원한다.

위 코드에서 나는 throw를 안했는데

누가 throw를 했길래 DivideByZeroException이 catch된것일까?


예외는  a/b 할때 발생한것이다

int operator / (나누기 오퍼레이터) 에서 발생한 예외인데

이것을 Main함수에서 캐치한것이다.

이처럼 내부에서 발생한 함수를 그 함수를 호출한곳에서 catch 가 가능하다.



이런식으로 Fn()에서 예외가 throw가 되도 이를 main에서 처리할수있다.

이러한 기능을 스택되감기라고 한다.



예외처리를 통하여 예외부분과 처리부분이 분리가 명확해진다.


다만 스택 되감기, 객체 생성해서 던지기 등으로 걍 if문 처리보다 프로그램이 커지고 시간을 잡아먹으므로

적절히 사용해야한다.

728x90