프로그래밍

ASP.NET CORE 8에서의 Exception 처리

itssue-host 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 클래스를 별도로 선언한다면 에러 처리시에 더 나은 코드를 작성할 수 있을 것이다.

 

도움이 되길 바라며...