반응형
try-catch란
try-catch는 코드 실행 중 예기지 못한 오류(예외)가 발생했을 때, 프로그램이 강제 종료되지 않도록 오류를 잡아서 처리하는 구조를 말한다.
try
{
// 예외가 발생할 수 있는 코드
}
catch (Exception ex)
{
// 예외가 발생했을 때 수행할 코드
}
finally
{
// 예외가 발생하건 아니건 항상 수행되는 코드
}
- try : 위험한 코드를 실행
- catch : 예외를 감지하고 처리 (로깅, 사용자 응답, 재시도 등)
- finally : 예외 여부와 관계없이 자원 정리 (Close, Dispose 등)
catch가 꼭 필요한가?
- 예외를 무시하고 싶을 때 > 필요 없음
- 예외 상황을 알고 반응해야 할 때 > 필수 (catch가 없으면 로그도 남기지 못함)
- 하위 메서드가 예외를 다시 throw하지 않을 때 > 필요 없음
- 예외 전파를 막고 응답을 제어하고 싶다면 > 필수
정리와 예외 반응을 명확하게 분리
try
{
await handler.RunAsync(); // 실패 가능
}
catch
{
// 예외 대응: 로깅, 리포트, 알림 등
}
finally
{
// 자원 정리: Dispose, Remove, Close
}
try-catch 흐름 파악을 위한 예제 코드
static void Main(string[] args)
{
try
{
try
{
var value = 1;
int temp = value / 0;
// Exception 발생시 바로 catch로 이동 이후 코드 실행 안됨
Console.WriteLine(temp);
}
catch (DivideByZeroException dex)
{
// 특정 Exception을 캐치해서 핸들링이 가능 여기에 잡히면 아래에서는 안잡힘
Console.WriteLine($"1. {dex.Message}");
}
catch (Exception e)
{
// 그외의 모든 에러들을 핸들링
Console.WriteLine($"2. {e.Message}");
}
}
catch (Exception ex)
{
// 내부에서 throw; 하지 않으면 여기서 잡히지 않는다.
Console.WriteLine($"3. {ex.Message}");
}
finally
{
try
{
var value = 1;
int temp = value / 0;
Console.WriteLine(temp);
}
catch (Exception e)
{
// 특정 exception을 캐치하는게 아니라면 여기서 잡힌다.
Console.WriteLine($"4. {e.Message}");
}
finally
{
Console.WriteLine("5. finally");
}
Console.WriteLine("6. finally");
}
}

내부에서 잡힌 Exception을 throw; 하지 않았기 때문에 3번 로그가 남지 않는다.
throw를 사용해서 상위로 Exception을 전달하는 예제
static void Main(string[] args)
{
try
{
try
{
var value = 1;
int temp = value / 0;
// Exception 발생시 바로 catch로 이동 이후 코드 실행 안됨
Console.WriteLine(temp);
}
catch (DivideByZeroException dex)
{
// 특정 Exception을 캐치해서 핸들링이 가능 여기에 잡히면 아래에서는 안잡힘
Console.WriteLine($"1. {dex.Message}");
throw;
}
catch (Exception e)
{
// 그외의 모든 에러들을 핸들링
Console.WriteLine($"2. {e.Message}");
throw;
}
}
catch (Exception ex)
{
// 내부에서 throw; 하지 않으면 여기서 잡히지 않는다.
Console.WriteLine($"3. {ex.Message}");
}
finally
{
try
{
var value = 1;
int temp = value / 0;
Console.WriteLine(temp);
}
catch (Exception e)
{
// 특정 exception을 캐치하는게 아니라면 여기서 잡힌다.
Console.WriteLine($"4. {e.Message}");
}
finally
{
Console.WriteLine("5. finally");
}
Console.WriteLine("6. finally");
}
}

'프로그래밍 > C#' 카테고리의 다른 글
| C# Serilog에서 Sub-Logger를 이용해서 별도의 하위 로거 설정하기 (0) | 2025.05.16 |
|---|---|
| 비동기 메서드의 형식을 맞추기 위해서 필요한 Task.CompletedTask (0) | 2025.05.15 |
| C# 객체 이니셜라이저(Object Initializer)를 알아보자 (1) | 2025.05.12 |
| C# EF Core 환경에서 데드락 방지 방법 (0) | 2025.05.12 |
| C# get-only 속성에 대해서 알아보자 (0) | 2025.04.28 |
댓글