나는(일반적으로) 전체적으로 크게 감싸서 Exception을 잡을 때는 try-catch-finally를 쓰고,
해제와 같은 일을 할때는 try-finally를 쓴다.
1. try-catch-finally
try
{
throw new NullReferenceException();
}
catch ( Exception e )
{
Console.WriteLine( $"It's Main's catch. :: {e.Message}" );
}
finally
{
Console.WriteLine( "It's Main's finally." );
}
이건 제일 기본형.
패킷 단위에서 Exception을 막을 때 유용하게 씀.
2. try-finally
static public void DoException()
{
try
{
Console.WriteLine( "It's DoException's try." );
throw new NullReferenceException();
}
finally
{
Console.WriteLine( "It's DoException's finally." );
}
}
static void Main( string[] args )
{
try
{
DoException();
}
catch ( Exception e )
{
Console.WriteLine( $"It's Main's catch. :: {e.Message}" );
}
finally
{
Console.WriteLine( "It's Main's finally." );
}
}
Exception이 일어나던 말던 무조건 실행 해줘야 하는 구문. (도중에 return을 만나도 실행됨.)
DB Connection이나 Monitor를 사용할 때 쓰면 좋다.
3. 예외 감싸기
static public void SomeFunction()
{
try
{
Console.WriteLine( "It's SomeFunction's try." );
DoException();
}
catch ( Exception e )
{
Console.WriteLine( $"It's SomeFunction's catch. :: {e.Message}" );
}
finally
{
Console.WriteLine( "It's SomeFunction's finally." );
}
}
static public void DoException()
{
try
{
Console.WriteLine( "It's DoException's try." );
throw new NullReferenceException();
}
finally
{
Console.WriteLine( "It's DoException's finally." );
}
}
static void Main( string[] args )
{
try
{
SomeFunction();
}
catch ( Exception e )
{
Console.WriteLine( $"It's Main's catch. :: {e.Message}" );
}
finally
{
Console.WriteLine( "It's Main's finally." );
}
}
위 처럼 하면 예외를 SomeFuntion에서 먹어버리고, Main으로 전파되지 않음.
static public void SomeFunction()
{
try
{
Console.WriteLine( "It's SomeFunction's try." );
DoException();
}
catch ( Exception e )
{
Console.WriteLine( $"It's SomeFunction's catch. :: {e.Message}" );
throw e; // -- 여기
}
finally
{
Console.WriteLine( "It's SomeFunction's finally." );
}
}
static public void DoException()
{
try
{
Console.WriteLine( "It's DoException's try." );
throw new NullReferenceException();
}
finally
{
Console.WriteLine( "It's DoException's finally." );
}
}
static void Main( string[] args )
{
try
{
SomeFunction();
}
catch ( Exception e )
{
Console.WriteLine( $"It's Main's catch. :: {e.Message}" );
}
finally
{
Console.WriteLine( "It's Main's finally." );
}
}
위처럼 하면 Exception을 전파시켜서 Main의 Catch에도 닿을 수 있음.
아주 쉬운 내용인데 자꾸 헷깔려서 글 쓰면서 정리해보았음.
'Programming > C# & Unity' 카테고리의 다른 글
C# Tuple, ValueTuple (0) | 2021.09.03 |
---|---|
C# 게임 서버 (.net core) 장단점 (4) | 2021.02.15 |
C# 자주 쓰는 Collection 집계 함수 (0) | 2020.01.29 |
C# 4.0 쓸만한 기능 (0) | 2020.01.10 |
C# 비동기 루프 및 실행 (2) | 2019.12.12 |