C# try ~ catch문을 이용하여 예외처리하기

Today Jeeho Learned·2022년 11월 10일
2

C#

목록 보기
2/17
post-thumbnail

INTRO

JAVA를 사용할 때부터 try catch문을 통한 예외처리를 하곤했었는데, 그냥 하길래 생각없이 해왔었는데, 이번에 c#을 이용해 시리얼통신을 구현하면서도 구글링한 참고 코드에 try catch문이 계속해서 사용되길래 제대로 한번 정리해야겠다고 생각했다.

예외처리는?

예외처리란 프로그램을 작성한 사람이 의도치않은 오류가 발생할때, 오류가 생기면 해결을 해주는 기능을 얘기한다.

예를 들어 모든 수는 0으로 나눌 수 없다.

        static void Main()
        {
 
            int a = 0;
            Console.WriteLine(100/a);
 
        }

이렇게 코드를 돌려보면

이렇게 처리되지 않은 예외가발생했다고 나오고 위치까지 친절하게 알려준다.

100을 0으로 나누려고 했기때문에 "System.DivideByZeroException"에러가 발생한 것이다. 저 메세지는 CLR이 출력한 것임! 0으로 나눴을때 에러정보를 DivideByZeroException객체에 담고 Main()메소드에게 던져준다. Main()메소드에게 던졌는데 Main()메소드는 이 예외를 처리할 방법이 없어서 다시 CLR에게 던진다. 그러면 프로그램이 종료됩니다.
에러를 Main() 메소드가 받았을때 처리하는 부분이 있으면 프로그램은 종료하지 않게 되고, 그러한 기능을 해주는게 예외처리이다.

try
{
    //실행코드
}
catch(예외 객체1)
{
    //예외1 발생했을때 코드
}
catch(예외 객체2)
{
    //예외2 발생했을때 코드
}
finally
{
    //무조건 실행되는 코드
}

이런 포맷으로 코드를 작성하면 된다.

		static void Main()
        {
 
            try
            {
                Console.WriteLine("try");
                int a = 0;
                Console.WriteLine(100 / a);
                Console.WriteLine("try end");
            }
            catch(DivideByZeroException err)
            {
                Console.WriteLine("catch : "+err.Message);
            }
            finally
            {
                Console.WriteLine("finally");
            }
            Console.WriteLine("end");
        }

"try"를 출력하고, 100을 0으로 나눈 부분에서 에러가 발생했다. 그래서 에러를 처리해주는 err.message를 출력해주고 그냥 작동하는 finally문이 실행되었다.
그런데 여기서 "try end"문은 출력되지 않았다. 왜? 에러가 발생해서 바로 catch문으로 내려갔기 때문이다. 또한 try catch문을 사용하지 않으면 마지막에 "end"부분도 에러가 발생해 프로그램이 종료되기 때문에 실행되지 않는다.

System.Exception 클래스

Exception클래스는 모든 예외의 조상이다. 모든 예외 클래스는 반드시 이 클래스를 상속 받아야 한다. 그래서 catch(Exception err)을 하면 모든 에러의 예외를 처리할 수 있게된다. 그래서 항상 excetpion을 사용하면 좋아보이지만, 섬세하게 에러를 처리해야할 경우라면 문제가 생길수도 있고, 예외가그 코드가 아닌 상위코드에서 처리해야 할 예외라면 예외는 처리되지만, 에러가 생길수가 있어서 잘 사용해야한다.

throw

        static void Main()
        {
 
            int a = 10;
            try
            {
                if(a>9)
                    throw new Exception("예외");
                Console.WriteLine("try end");
            }
            catch(Exception err)
            {
                Console.WriteLine("catch : "+err.Message);
            }
            finally
            {
                Console.WriteLine("finally");
            }
            Console.WriteLine("end");
        }

실행하면

throw을 통해 사용자가 예외를 직접 만들어서 처리해준 것이다.
그래서 "예외"가 출력되었고, 예외가 발생했기에 "try end"가 스킵했고, 예외를 처리했기에 finally로 넘어가 "finally"를 출력하고 "end"를 출력하게 된 것이다.

profile
기록해야 (살아)남는다 !

0개의 댓글