커스텀 Exception

beststar-1.tistory.com/5

 

예외(Excepton) - 정의, 목적, 구조, 사용 방법

정의 프로그램 실행 중에 발생하는 이벤트이면서 프로그램 로직의 정상적인 흐름을 방해하는 오류를 말한다. 우리는 그냥 '예외(Exception)' 라고만 부르는데, 사실 '예외적 이벤트(Exceptional Event)'

beststar-1.tistory.com

지난번 예외(Exception) 글에서는 미리 정의된 예외들만 다뤘었다.

그런데 그 외에도 우리가 직접 커스텀 Exception을 만들 수도 있다.

 

대신 Throwable 클래스와 상속관계에 있는 클래스를 상속해야만 한다.

일반적으로 실행 시 예외를 처리할 수 있는 경우에는 RuntimeException 클래스를 확장하는 것을 권장한다.

그러면 try catch문을 사용하지 않아도 컴파일 예외가 발생하지 않는다.

예외 계층 구조의 최상위 클래스는 Throwable이다.

이왕이면 Exception 이렇게 표시하는 것보다는 NumberFormatException 이런 식으로 명시하는 게

본인에게도 같이 일하는 프로그래머들에게도 코드 품질에도 좋다.

 

아래는 커스텀 Exception best practice 글을 참고 정리한 내용이다.

1. Always Provide a Benefit (표준 예외들과 비교했을때 장점이 있는지 검토하자)

자바 표준 예외들에는 포함되어 있는 다양한 장점을 가지는 기능들이 있다.

이미 JDK가 제공하고 있는 방대한 수의 예외들과 비교했을 때 만들고자 하는 커스텀 예외는 어떠한 장점도 제공하지 못한다면? 커스텀 예외를 만드는 이유를 다시 생각해볼 필요가 있다.

어떠한 장점을 제공할 수 없는 예외를 만드는 것보다

UnsupportedOperationException, IllegalArugmentException 같은 표준 예외 중 하나를 사용하는 것이 낫다.

2. Follow the Naming Convention (Exception으로 끝나는 네이밍 컨벤션을 따르자)

JDK가 제공하는 예외 클래스들을 보면 클래스의 이름이 모두 "Exception"으로 끝나는 것을 알 수 있다.

이러한 네이밍 규칙은 자바 생태계 전체에 사용되는 규칙이다.

즉, 만들고자 하는 커스텀 예외 클래스도 이 네이밍 규칙을 따르는 것이 좋다.

3. Provide javadoc Comments for Your Exception Class (커스텀 예외에 대한 자바 문서를 제공하자)

많은 커스텀 예외들이 어떠한 JavaDoc 코멘트도 없이 만들어진 경우들이 있다.

기본적으로 API의 모든 클래스, 멤버 변수, 생성자들에 대해서는 문서화하는 것이 일반적인 Best Practices이다.

잘 알겠지만 문서화되지 않은 API들은 사용하기 매우 어렵다.

예외 클래스들은 API에 크게 드러나지 않는 부분일 수 있으나 사실상 그렇지 않다.

클라이언트와 직접 관련된 메서드들 중 하나가 예외를 던지면 그 예외는 바로 예외의 일부가 된다.

그렇다는 것은 잘 만들어진 JavaDoc와 문서화가 필요하다는 뜻이다.

JavaDoc은 예외가 발생할 수도 있는 상황과 예외의 일반적인 의미를 기술한다.

목적은 다른 개발자들이 API를 이해하고 일반적인 에러 상황들을 피하도록 돕는 것이다.

/**
* MyBusinessException은 선택된 모든 표준 자바 예외를 래핑하고 사용자 정의 오류 코드로 보강합니다.
* 이 코드를 사용하여 로컬라이징된 예외 메시지를 검색하고 온라인 설명서에 연결할 수 있습니다.
* @author TJanssen
*/
public class MyBusinessException extends Exception { ... }

4. Provide a Constructor That Sets the Cause ()

커스텀 예외를 던지기 전에 표준 예외를 Catch 하는 케이스가 꽤 많다.

이 사실을 간과하지 말자.

보통 캐치된 예외에는 제품에 발생한 오류를 분석하는데 필요한 중요한 정보가 포함되어 있다.

 

아래 예제를 보면 NumberFormatException은 에러에 대한 상세 정보를 제공한다.

MyBusinessException의 cause처럼 예외의 원인 정보를 설정하지 않으면 중요한 정보를 잃을 것이다.

public void wrapException(String input) throws MyBusinessException
{
    try
    {
        // 뭔가를 수행함
    }
    catch (NumberFormatException e)
    {
        throw new MyBusinessException("A message that describes the error.",
            e, ErrorCode.INVALID_PORT_CONFIGURATION);
    }
}

 


출처

커스텀 Exception

https://dzone.com/articles/implementing-custom-exceptions-in-java?fromrel=true