예외처리가 필요한 경우
- 함수 내에서 예외를 처리하는 경우 이러한 함수가 생길 수 있다.
// 피제수가 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 );
}
'🌍 C# Study > C# 기초' 카테고리의 다른 글
C# 복습하기 13) 람다식 (0) | 2021.04.13 |
---|---|
C# 복습하기 12) 대리자와 이벤트 (0) | 2021.04.12 |
C# 복습하기 10) 일반화 프로그래밍 (0) | 2021.04.11 |
C# 복습하기 9) 배열, 컬렉션, 인덱서 (0) | 2021.04.11 |
C# 복습하기 8) 프로퍼티 (0) | 2021.04.10 |