3_c#/C#문법

C# 예외 처리 : 개념 정리

Mi:sAng 2023. 7. 13. 23:44

0. 예외 처리

    - 예외가 프로그램의 오류나 다운으로 이어지지 않도록 적절하게 처리하는 것

 

1. 예외 처리가 필요한 이유

    - 아래 예제를 보자. 처리되지 않은 예외는 CLR이 출력한 것인데,

      잘못된 인덱스로 배열의 요소에 접근할 경우에 배열 객체가 이 문제의 정보를

      IndexOutOfRangeException의 객체에 담아서 Main() 메소드로 던진다. 

      Main 메소드는 이 예외를 처리할 방법이 없기 때문에 CLR에 던지게 되고,

      CLR은 예외 객체에 담긴 내용을 사용자에게 출력한 후 프로그램을 강제로 종료한다.

 

    - 프로그램은 예외에 대처할 수 있어야한다. 그러하지 않는다면 강제로 종료될 것이다.

      그래서 예외 처리가 필요하다.

 

using System;

namespace PG
{
	class MainApp
    {
    	static void Main(string[] args)
        {
        	int[] arr = {4,5,6];
            for(int i=0; i<5 ; i++)
            {
            	Console. WriteLine(arr[i]);
                //i가 [배열 -1] 을 넘어서면 예외 던지고 종료됨
            }
			Console.WriteLine("종료");
        }
    }
}
실행결과
4
5
6
처리되지않은 예외 : System.IndexOutOfRangeException : 인덱스가 배열범위를 벗어났습니다

 

 

2. try -catch

    *위 예제에서 Main()메소드는 예외를 받지  못하였다. 

      Main()메소드가 예외를 받는 방법은 Try Catch 문이다.

 

    *기본 형식

try{
	//실행할 코드
}
catch(예외_객체1){
	//예외가 발생했을 때 어떻게 처리할 지
}
catch(예외_객체2){
	//예외가 발생했을 때 어떻게 처리할 지
}

 

    *예시

using System;

namespace PG
{
	class MainApp
    {
    	static void Main(string[] args)
        {
        	int[] arr = {4,5,6];
            try
            {
            	for(int i=0; i<5 ; i++)
            	{
            		Console. WriteLine(arr[i]);
                	//i가 [배열 -1] 을 넘어서면 예외 던지고 종료됨
            	}
            }
            catch(IndexOutOfRangeException e)
            {
            	Console.WriteLine($"예외 발생 : {e.Message}");
            }
            
			Console.WriteLine("종료");
        }
    }
}

 

3.System.Exception

    *C#에서 모든 예외 클래스는 반드시 이 클래스로부터 상속받아야한다.

 

    *IndexOutOfRangeException 예외도 System.Exception으로부터 파생되었다.

 

    *catch 절에서 IndexOutOfRangeException을 썼었는데, 이 클래스 역시

     System.Exception으로 부터 파생되었다.즉, Exception e로  대체할 수도 있다.

      (단, 세세한 예외로 나누는 게 필요할 때는 Exception으로 묶는 것은 좋지 않다)

 

4. Throw

    *Main() 메소드는 Try Catch 문으로 예외를 받았다. 예외를 던질 때는 Throw를 이용한다.

     위 예제에서 보면 throw 없이도 예외를 잘 던진다. 그래서 언제 정확히 throw를 쓰는 지를 

     생각해볼 필요가 있다. 

 

    *Try에서 throw해서 Catch에서 예외를 받는다.

 

    *예시

try
{
	throw new Exception("예외를 던집니다");
}

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

 

 

5.try catch, finally

    *try 블록에서 코드를 실행하다가 예외가 던져지면 프로그램의 실행이

     catch 절로 바로 뛰어넘어간다. 만약 예외가 발생하여 try 블록의 중요한 코드를

     미처 실행하지 못한다면 이는 버그가 된다.

 

    *C#에서는 예외 처리를 할 때 뒷마무리를 깔끔하게 실행할 수 있도록 finally 절을

      try ~ catch와 함께 제공한다. 

 

    *finally 절은 try ~ catch문의 마지막에서 사용하고, 이곳에 마지막에 실행할 코드를 넣는다.

 

    *기본 형식

 try{
 
 }
 catch(???Exception e){
 
 }
 catch(???Exception e){
 
 }
 finally{
 	//맨 뒤에 실행할 코드 
 }

 

    *예시

        -예외가 일어나지 않고 정상적으로 return해도 finally 절은 실행됩니다.

 

        -예외가 일어나더라도 finally절은 실행됩니다.

try{
	Console.WriteLine("123");
    return 30;
}
catch(Exception e){
	Console.WriteLine("예외");
    throw e;
}
finally{
	ConsoleWriteLine("끝");
}

     

6. 예외 필터링

    *예외 필터

        -예외 객체에 제약 사항을 명시해서 해당 조건을 만족하는 예외 객체에 대해서만

         예외 처리 코드를 실행할 수 있도록 한다.

 

        -catch 절 뒤에 when 키워드를 이용하면된다.

 

    *예시

        -e.ErroNo이 음수일때만 catch절에서 예외를 받을 수 있다.

 

class FilterableException : Exception
{
	public int ErrorNo {get;set;}
}

try
{
	int num = GetNumber();
    if( num< 0 || num > 10)
    	throw new FilterableException(){ErroNo = num};
    else
        Console.WriteLine($"Output : {num}");   
}
catch(FilterableException e) when (e.ErrorNo <0)
{
	Console.WriteLine("Negative input is not allowed");
}

 

 

 

 

출처 <a href="https://kr.freepik.com/free-vector/linear-gradient-retro-cassette_13405019.htm#query=lofi&position=7&from_view=search&track=sph">작가 pikisuperstar</a> 출처 Freepik

'3_c# > C#문법' 카테고리의 다른 글

C# 프로퍼티  (1) 2024.11.20
C# 메소드 오버로딩 / 오버라이딩  (0) 2024.10.02
C# TXT파일 접근 - StreamReader, StreamWriter  (0) 2023.07.18
C# 클래스  (0) 2023.07.15
C# 인터페이스 / 추상 클래스  (0) 2023.07.13