C#을 포함한 모든 .NET Framework 언어는 .NET의 System.Exception 클래스를 기본으로 한다
만약 Exception이 발생하였는데 프로그램에서 처리하지 않으면 Crash하여 종료된다
try, catch, finally 키워드를 사용해 Exception을 핸들링한다
try
{
// 실행 문장들
}
catch (ArgumentException ex)
{
// Argument 예외처리
}
catch (AccessViolationException ex)
{
// AccessViolation 예외처리
}
finally
{
// 마지막에 반드시 실행
}
throw 키워드를 통해 Exception을 생성해 발생시키거나 상위 호출자에게 예외 처리를 이임할수 있다
1) catch에서 전달받은 Exception 객체 throw
throw ex;
catch(Exception ex)에서 전달받은 ex를 그대로 throw 한다
ex에 담긴 예외 정보를 그대로 보전할 수 있다는 장점이 있지만, Stack Trace 정보를 리셋하기 때문에 throw문 이전의 콜스택 정보를 유실하게 되므로 사용을 권장하지 않는다
2) 새로운 Exception 객체를 생성해서 throw
throw new MyException(msg, ex);
C#의 new 키워드를 사용해 catch에서 잡은 Exception을 Wrapping해 새로운 Exception 객체를 생성
catch에서 얻은 Exception 객체를 새 객체의 InnerException에 포함시켜 예외 정보를 보전해야 한다
3) only throw
throw;
Exception 객체 없이 그냥 throw만을 사용
catch문에서 잡힌 예외를 그대로 상위 호출자에게 전달(rethrow)
try
{
// 실행 문장들
Step1();
Step2();
Step3();
}
catch(IndexOutOfRangeException ex)
{
// 새로운 Exception 생성하여 throw
throw new MyException("Invalid index", ex);
}
catch(FileNotFoundException ex)
{
bool success = Log(ex);
if (!success)
{
// 기존 Exception을 throw
throw ex;
}
}
catch(Exception ex)
{
Log(ex);
// 발생된 Exception을 그대로 호출자에 전달
throw;
}