프로그래밍 언어/C#

C# 예외처리 try,catch,finally

원원 2021. 11. 14. 19:00

안녕하세요 오늘은 C# 예외처리에 대해 알아보겠습니다

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

 

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

1
2
3
4
5
6
7
        static void Main()
        {
 
            int a = 0;
            Console.WriteLine(100/a);
 
        }
cs

예외 발생: 'System.DivideByZeroException'(practice.exe)
처리되지 않은 'System.DivideByZeroException' 형식의 예외가 practice.exe에서 발생했습니다.
0으로 나누려 했습니다.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try
{
    //실행코드
}
catch(예외 객체1)
{
    //예외1 발생했을때 코드
}
catch(예외 객체2)
{
    //예외2 발생했을때 코드
}
finally
{
    //무조건 실행되는 코드
}
 
cs

위의 포맷으로 코드를 작성하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        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");
        }
cs

실행결과
try
catch : 0으로 나누려 했습니다.
finally
end

8번째줄에서 에러가 발생했습니다. 그래서 에러를 잡아주는 13번째줄을 실행하고 finally로 가서 17번째줄을 실행하고 19번째줄을 실행하고 프로그램이 종료됩니다.
9번째줄은 실행되지 않습니다. 왜냐하면 8번째줄에서 에러가 발생해서 catch로 갔기 때문입니다. 이러한 이유르 만약 자원을해제하는코드 .close()를 사용하는 경우에는 try에 놓으면 안되고 finally에 놓아야합니다.
그리고 만약 try catch를 사용하지 않았으면 19번째줄은 실행되지 않습니다. 에러가 발생해서 바로 프로그램이 종료되버리기 때문입니다.

 

위의 내용이 예외처리의 기본이고 추가로 자주 사용하는 기능을 적어보겠습니다

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

 

- throw
사용자가 예외를 만들어서 예외를 던집니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        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");
        }
cs

catch : 예외
finally
end
8번째줄에서 (a>9)인경우 예외를 발생시킵니다.

'프로그래밍 언어 > C#' 카테고리의 다른 글

C# 스레드 사용하기  (0) 2022.04.25
C# 시리얼통신 데이터 잘려서 읽히는 경우  (2) 2021.11.27
C# this키워드  (0) 2021.10.23
C# 생성자  (0) 2021.10.18
C# Format 메소드 사용하기  (0) 2021.10.02