프로그래밍
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 클래스를 별도로 선언한다면 에러 처리시에 더 나은 코드를 작성할 수 있을 것이다.
도움이 되길 바라며...