C# 복습하기 11) 예외 처리

 

예외처리가 필요한 경우

 - 함수 내에서 예외를 처리하는 경우 이러한 함수가 생길 수 있다.

// 피제수가 0이면 음수를 반환하고, 아니면 몫을 반환한다.
static int Divide(int divisor, int dividend)
{
    if(dvidend == 0)
        return -1;
    else 
        return divisor / dividend;
}

 - try~catch를 사용할 경우 예외의 코드가 분리될 수 있기 때문에 코드를 간결하게 만들어준다.

 

try~catch로 예외 받기

 - try 블록에는 예외가 발생하지 않았을 때의 처리 내용이 들어가며,

   예외가 발생했을 경우 코드의 실행이 중지되고 catch 절에서 받는다.

try
{
    // 실행 코드
}
catch( 예외1 )
{
    // 예외 처리
}
catch( 예외2 )
{
    // 예외 처리
}

 

System.Exception 클래스

 - 모든 예외는 System.Exception을 상속받음.

 - 때문에 최상위인 Exception을 사용한 catch로 모든 예외를 처리할 수 있다.

 - 하지만 모든 예외를 받기 때문에 처리하지 않아야 할 예외까지 처리할 가능성이 있다.

try
{
    // 실행 코드
}
catch( System.Exception e )
{
    //  처리
}

 

예외 던지기

 - throw문을 통해서 직접 예외를 던질 수 있다.

try
{
    //...
    throw new Exception("예외");
}
catch(Exception e)
{
    Console.WriteLine( e.Message );
}

 - throw는 문(statement)이지만, C# 7.0부터는 식(expression)으로도 사용할 수 있다.

int? a = null;
int b = a ?? throw new ArgumentNullException(); // a가 null이라서 할당이 발생하지않는다.

 

finally

 - 예외가 발생하면 뒷부분은 실행되지 않고 catch로 빠지기 때문에,

   자원 해제 같은 뒷마무리를 처리할 수 있도록 try~catch 문에 연결해서 사용함

 - finally구문은 예외 발생 여부와 상관없이 마지막에 반드시 실행된다.

 - 물론 finally문 내부에서도 예외가 발생할 가능성이 있지만, 처리되지 않으니 주의.

try
{
    //...
    throw new Exception("예외");
}
catch(Exception e)
{
    // 예외처리
}
finally
{
    // 빠져나갈 경우 실행된다.
}

 

사용자 정의 예외 클래스

 - Exception을 상속시켜서 별도의 예외 클래스를 만들 수 있다.

 - 기본적인 예외 클래스들로도 해결할 수 있지만, 예외 상황에 대한 정보를 추가적으로 넘겨서 처리할 수 있다.

class MyException : Exception
{
    public MyException(){ }
   
    public object Argument{ get; set; }
    public string Range{ get; set; }
}

class MainApp
{
    static void Main(string[] args)
    {
        try
        {
            //...
            throw new MyException()
            {
                Argument = "arg",
                Range = "0~255"
            }
        }
        catch( MyException e )
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.arg + e.Range);

        }
    }
}

 

예외 필터 하기

 - C# 6.0부터 catch절이 받을 예외에 제약을 명시하는 예외 필터가 도입됨.

 - catch 문 뒤에 when 키워드를 사용하여 제약을 명시함.

 - 제약에 맞지 않는다면 예외는 처리되지 않은 그대로 현재 코드의 호출자에게 던져짐.

int count = 5;

try
{
    //...
    throw new Exception("예외");
}
catch(Exception e) when (count < 3) // count가 3 미만일때만 예외처리함
{
    Console.WriteLine( e.Message );
}

 

 

 

 

 

 

 

댓글

Designed by JB FACTORY