-
ASP.NET CORE 8에서의 Exception 처리프로그래밍 2024. 10. 21. 17:35
ASP.NET CORE 8 버전 이후부터는 Exception처리를 하도록 명시적 확장이 추가되었다.
이전까지는 middleware를 직접 선언하여 처리한 것에 비해 이제는 프레임워크 상에서 명시적으로 Error 처리를 구현하도록 하고 있다.
예제를 보자.
public class GlobalErrorHandler(ILogger<GlobalErrorHandler> logger) : IExceptionHandler { private readonly ILogger _logger = logger; public async ValueTask<bool> TryHandleAsync(HttpContext context , Exception exception , CancellationToken cancellationToken) { _logger.LogError(exception, "Exception occurred : {Message}", exception.Message); var statusCode = exception switch { SafeException => StatusCodes.Status200OK, DuplicateSignInException => StatusCodes.Status401Unauthorized, UnauthorizedAccessException => StatusCodes.Status401Unauthorized, _ => StatusCodes.Status500InternalServerError }; context.Response.ContentType = "application/json"; context.Response.StatusCode = statusCode; var problem = new ProblemDetails() { Status = statusCode, Title = "Server Error", Type = exception.GetType().Name, Detail = exception.Message, }; var result = await Results<ProblemDetails>.FailAsync(problem); await context.Response.WriteAsJsonAsync(result, cancellationToken: cancellationToken); return true; } }
위 예제는 Application에 대한 전체 Error처리를 하기 위해 생성한 클래스이다.
사용은 아래와 같다.
builder.Services.AddExceptionHandler<GlobalErrorHandler>(); builder.Services.AddProblemDetails();
위와 같이 정의할 경우 이제 부터 발생하는 모든 Application의 Error는 GlobalErrorHandler를 통해서 처리되게 된다.
이러한 코드를 사용할 경우 주의해야 할 사항이 있는데, 가급적 Exception을 정의하여 처리하는 것이다.
흔히 사용하는 throw new Exception을 사용하지 말고
Exception을 상속받은 사용자 생성 Exception을 사용한다면 상태 코드 처리 및 예외처리 시에 구분하여 사용할 수 있으므로 이점을 제공한다.
public class DuplicateSignInException : Exception { public DuplicateSignInException(string message) : base(message) { } }
위와 같이 2중 로그인을 방지하기 위한 Exception 클래스를 별도로 선언한다면 에러 처리시에 더 나은 코드를 작성할 수 있을 것이다.
도움이 되길 바라며...
'프로그래밍' 카테고리의 다른 글
Json을 통한 Kafka ObjectId에 대한 처리 (0) 2024.10.21 확장 메서드란? (0) 2024.10.21 AWS Secrets Manager에 대하여 (0) 2024.10.21 ASP.NET CORE Serilog 설정 및 사용 (0) 2024.10.17 ASP.NET CORE에서의 JWT 처리 (0) 2024.10.16