본문 바로가기
.NET/ASP.NET Web API2

Exception Handling

by 니니01 2018. 4. 9.

ASP.NET Web API2에서 예외 처리 방법은 총 3가지가 있습니다.

  • ExceptionFilter
  • ExceptionHandler
  • ExceptionLogger
각 방법의 특징과 차이점을 알아보겠습니다.


ExceptionFilter

특정 작업이나 Controller에서 발생한 예외를 처리할 때 적합합니다.

IExceptionFilter를 구현하는 ExceptionFilterAttribute를 상속받아 ExceptionFilter를 생성하면 OnException메소드에서 예외 처리가 가능합니다.

actionExecutedContext를 통해 예외 유형에 접근하고 응답을 변경하여 client에게 알려줄 수 있습니다.



ExceptionHandler

Exception Filter가 처리하지 못하는 오류를 포함하여 응용프로그램 내에서 발생하는 모든 오류에 대해 커스터마이징하여 응답을 보낼 수 있습니다.


Exception Filter가 처리하지 못하는 오류.

1. 컨트롤러 생성자에서 발생 된 예외

2. 메세지 핸들러에서 발생 된 예외

3. 라우팅 중 발생 된 예외

4. 응답 직렬화 과정에서 발생 된 예외



ExceptionLogger

처리되지 않은 모든 예외가 발생했을 때 항상 호출 되어 로그를 남길 수 있습니다. Logger에서 응답을 보낼 수는 없습니다.



ExceptionLogger vs ExceptionHandler

1. Logger는 Web API에서 모든 예외가 발생했을 때, 항상 호출됩니다. 하지만 Handler는 응답을 보낼 수 있는 경우에만 호출됩니다. 응답을 보낼 수 없는 경우에 대해 아래와 같이 설명되어있습니다.

응답을 보내는 중에 예외가 발생했을 경우, 이미 상태코드, 헤더 및 부분 컨텐트가 이미 유선을 통과해 새로운 응답을 보내기 어려우므로 간단히 연결을 중단하고 로그를 남긴다.     - MS Docs

2. ExceptionLogger는 여러 개 등록 가능, ExceptionHandler는 하나만 등록 가능.




요약
ExceptionHandler는 ExceptionFilter가 처리하지 못하는 오류도 처리할 수 있기 때문에 ExceptionHandler를 전역으로 등록해서 일관성 있게 예외처리를 하고, 특정 작업이나 Controller에 따라 예외 처리를 다르게 해야 할 경우 ExceptionFilter를 부분적으로 사용하는 것이 좋습니다.
처리되지 않은 예외에 대해 로그를 남기는 작업은 매우 중요하므로, 예외 발생 시에 항상 호출되는 것이 보장되는 ExceptionLogger를 사용하여 로그를 남기도록 합니다.



Do more
  • 응답을 보낼 수 없는 경우 재현
    MS Docs 문서를 참고하여 ExceptionLogger만 호출되는 경우를 재현하려 했으나 실패했습니다. 혹 재현 해보신 분은 공유 부탁드립니다.
  • 왜 ExceptionLogger는 여러개, ExceptionHandler는 한개만 등록 가능할까



References

Handling Errors in Web API Using Exception Filters and Exception Handlers




'.NET > ASP.NET Web API2' 카테고리의 다른 글

ASP.NET Web API pipeline  (0) 2018.03.28
ASP.NET Web API2  (0) 2018.03.12