반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발꿈나무

[C# 교과서] 9. C# 활용(3) - 예외 처리하기 본문

C# 기초

[C# 교과서] 9. C# 활용(3) - 예외 처리하기

HYOKYE0NG 2022. 1. 17. 14:03
반응형
 예외 처리하기

 

예외와 예외 처리

C#에서 예외(exception)는 프로그램이 실행되는 동안 발생하는 에러(error)를 의미한다.

코드를 잘못 작성하거나 기타 다른 이유로 발생한 예외는 프로그램을 강제적으로 종료하거타 틀린 결과가 나오는 방식으로 발생하는데, 이러한 예외에 대한 대비로 예외처리를 해야 한다.

 

오류 종류

  • 문법 오류(syntax error): 잘못된 명령어를 입력했거나 실수로 발생하는 오류로 컴파일 오류라고도 한다. 대부분 C# 컴파일러가 잡아준다.
  • 런타임 오류(runtime error): 프로그램을 만든 후 실행할 때 발생하는 오류로 컴파일 과정에서는 발생하지 않고 실행할 때 발생하기에 많은 테스트를 통해 잡을 수 있다.
  • 알고리즘 오류(logic error): 주어진 문제에서 잘못된 해석으로 잘못된 결과를 초래하는 오류로 처리 결과가 틀렸는데 오류를 알 수 없는 경우가 많다.

 

try ~ catch ~ finally 구문

  • try: 예외가 발생할 만한 구문 묶음
  • catch: 예외가 발생했을 때 처리해햐 하는 구문 묶음
  • finally: 예외가 발생 또는 발생하지 않아도 마무리 관련 처리해야 할 구문 묶음
try
{
	//예외 발생할 만한 코드
}
catch
{
	//예외가 발생할 때 처리해야 할 코드 블록
}
finally
{
	//예외가 발생하거나 정상일 때 모두 처리해야 할 코드 블록
}

 

try와 catch 구문으로 예외 처리하기

using System;

class TryCatch
{
    static void Main()
    {
        try
        {
            int[] arr = new int[2];
            arr[100] = 1234; // 예외(에러) 발생: System.IndexOutOfRangeException
        }
        catch
        {
            Console.WriteLine("에러가 발생했습니다.");
        }
    }
}

//result: 예외가 발생했습니다.

정수형 배열인 arr은 요소 2개를 담을 수 있다. 그런데 arr[100] 형태로 없는 인덱스에 값을 입력하려고 하여 예외가 발생한다.

 

try ~ catch ~ finally 구문으로 예외 처리하기

using static System.Console;

class TryCatchFinallyDemo3
{
    static void Main()
    {
        int x = 5;
        int y = 0;
        int r;

        try // 예외가 발생할만한 구문이 들어오는 곳
        {
            r = x / y; // 0으로 나누기 시도
            WriteLine($"{x} / {y} = {r}");
        }
        catch // try 절에서 예외가 발생하면 실행
        {
            WriteLine("예외가 발생했습니다.");
        }
        finally // 예외가 발생하던 안하던 실행
        {
            WriteLine("프로그램을 종료합니다.");
        }
    }
}

/*
<result>
예외가 발생했습니다.
프로그램을 종료합니다.
*/

try 절에서 에러가 발생하면 catch 절이 실행된다. 그리고 에러 발생의 여부와 상관없이 finally 절이 실행된다.

 

 

Exception 클래스로 예외 처리하기

닷넷에서 모든 예외에 대해 처리할 주요 기능을 담아 놓은 클래스가 Exception이다.

Exception 클래스의 주요 속성에는 Message가 있는데, 현재 예외 설명을 출력한다.

 

예외 처리 구문에 Exception 클래스 사용하기

using System;

class ExceptionDemo
{
    static void Main()
    {
        try
        {
            int[] arr = new int[2];
            arr[100] = 1234;
        }
        catch (Exception ex) // ex 변수에는 예외에 대한 상세 정보가 담김
        {            
            Console.WriteLine(ex.Message);
        }
    }
}

//result: Index was outside the bounds of the array.

예외 내용을 Exception 클래스 형식의 변수인 ex에 담아 Message 속성으로 예외 내용을 알려준다.

 

 

throw 구문으로 직접 예외 발생시키기

C#에서 throw 구문은 인위적으로 예외(에러)를 발생시킨다.

throw new Exception();
//'System.Exception' 형식의 예외가 Throw되었습니다.

throw new ArgumentException();
//값이 예상 범위를 벗어났습니다.

 

throw를 이용하여 예외 발생시킨 후 try ~ catch ~ finally 구문으로 처리하기

using System;

class ExceptionHandling
{
    static void Main()
    {
        int a = 3;
        int b = 0;

        try
        {
            //[1] b가 0이므로 런타임 에러 발생
            a = a / b;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"예외(에러)가 발생됨: {ex.Message}");
        }
        finally
        {
            Console.WriteLine("try 구문을 정상 종료합니다.");
        }
        
        /*
        예외(에러)가 발생됨: Attempted to divide by zero.
		try 구문을 정상 종료합니다.
        */

        try
        {
            //[2] Exception 클래스에 에러 메시지 지정하여 무조건 에러 발생
            throw new Exception("내가 만든 에러");
        }
        catch (Exception e)
        {
            Console.WriteLine($"예외(에러)가 발생됨: {e.Message}");
        }
        finally
        {
            Console.WriteLine("try 구문을 정상 종료합니다.");
        }
        
        /*
        예외(에러)가 발생됨: 내가 만든 에러
		try 구문을 정상 종료합니다.
        */
    }
}

catch 절은 Exception 클래스 같은 예외 형식을 다르게 하여 여러번 지정 가능

 

 

 

<Reference>

 

반응형
Comments