2016-06-22 1 views
1

내 코드에서 사용할 사용자 지정 예외를 만들고 싶습니다. 이렇게 정의하면사용자 지정 예외를 만드는 데 필요한 최소값

public class MyException extends Exception {} 

은 여전히 ​​사용할 수있는 빈 생성자 만 제공합니다. 그래서 모든 생성자를 수동으로 정의해야합니다. 재정의해야하는 생성자 목록이 있습니까? 그렇게해야합니까?

MyException(/* args */) { 
    super(/* same args */); 
} 
+1

문자열 생성자, 예외 생성자 및 둘의 조합. 오류를 설정하고, 예외의 통과 추적을 설정하고, 조합을 허용합니다. 그냥 내 의견. – Compass

답변

3

샘플이 정상적으로 보입니다.

그것에 대한 스크립트 규칙이 없습니다, 당신이 응용 프로그램에서 사용할 필요가 생성자를 오버라이드 (override), 당신은 내가 항상 할 생각 생성자 here for java 8

인수 없음의 생성자

의 목록을 볼 수 있습니다 생성자를 어떤 종류로 만들지 확실하지 않은 경우 사용할 수있는 첫 번째 것이므로 항상 인수가없는 생성자를 재정의하는 것이 좋기 때문에이 생성자를 재정의해야합니다.

그러나 일반적으로 메시지없이 예외를 throw하는 것은 좋지 않으므로 메시지를없이 예외를 만들지 않으려면 을 명시 적으로 선언하기 위해 private/protected로 변경하는 것이 좋습니다.

은 제외하고 추가 정보를 전달할 수 있습니다 그것은 매우 편리하기 때문에 내가 먼저 하나를 오버라이드 (override) 할

메시지

Exception() 
// Constructs a new exception with null as its detail message. 

생성자입니다.

Exception(String message) 
// Constructs a new exception with the specified detail message. 

다시 던지는 추가 정보없이와/당신의 예외를 다시 던질해야하는 경우 다음을 무시할 수

예외입니다.

Exception(String message, Throwable cause) 
// Constructs a new exception with the specified detail message and cause. 

Exception(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) 
// Constructs a new exception with the specified detail message, cause, suppression enabled or disabled, and writable stack trace 

활성화 또는 비활성화.

Exception(Throwable cause) 
// Constructs a new exception with the specified cause and a detail message of (cause==null ? null : cause.toString()) (which typically 


)의 원인이 된 클래스와 상세 메세지가 포함되어 있습니다.

+0

인수가없는 생성자를 구현하는 것이 왜 항상 의미가 있는지 설명해 주시겠습니까? 사용하지 않거나 사용하지 못하도록 막으려면 구현할 이유가 없습니다. 생성자는 상속되지 않으므로 재정의하지 않습니다. (... 그리고 다른 이름을 가지고 ...) – Arjan

+0

@Arjan이 덧글을 주셔서 감사합니다, 그것에 대한 자세한 정보를 추가, 내 가정은 분명하지만, 거기에 잘못 될 수 있습니다 :) – gevorg

+0

흠 아마도 내 질문은 분명하지 않았을 것이다. 내가 이해하지 못하는 것은 다음과 같다 : 왜 당신은 메시지없이 (또는 원인없이) 예외를 생성하기를 원하지 않는다면 비공개로 인수없는 생성자를 구현 하겠는가? 아무 인자도없는 생성자를 모두 구현 **. 이점은 무엇입니까? 'new CustomException();을 사용할 수 없습니다. – Arjan

3

예외는 모두 정보로 저장하려는 대상에 따라 다릅니다.

그러나 일반적으로 근본 원인을 제공하는 것이 좋습니다.그리고 예외 (코드 같은 것)에서보다 구조화 된 정보를 원한다면 메시지도 좋은 아이디어입니다.

그렇습니다. Exception과 동일한 생성자를 제공하고 해당 슈퍼 생성자에 위임하는 것은 좋은 경험 법칙입니다.

메시지 인수가없는 생성자를 제공하지 않아도 호출자가 항상 메시지를 전달하도록 (또는 강제로) 설정할 수 있습니다.

1

첫 번째 예는 throw new MyCustomException()을 사용하려는 경우에만 작동하지만 예외가 발생한 경우 ... 자세한 정보를 제공 할 수 있습니다. 디버깅을 쉽게 할 수 있습니다.

다른 사용자가 예외 클래스를 사용하는 경우 더 명시적인 메시지를 사용하거나 재실행하는 경우 원인을 전달할 수 있습니다. 또는 누군가 다른 사람이 코드를 디버그해야하는 경우 메시지 나 원인없이 예외가 발생하지 않으면 교착 상태가되지 않을 가능성이 훨씬 큽니다. 예를 들어 내가 내 마지막 프로젝트에 사용되는 사용자 정의 예외

, 전부

public final class CryptorException extends Exception { 

    private static final long serialVersionUID = 1L; 

    public CryptorException(String message) { 
     super(message); 
    } 

    public CryptorException(Throwable cause) { 
     super(cause); 
    } 

    public CryptorException(String message, Throwable cause) { 
     super(message, cause); 
    } 
} 

. 몇 초가 걸리고 거의 노력하지 않습니다. 매개 변수없이 생성자를 구현하지 않은 방법에 유의하십시오. 원하는 경우 추가해야합니다.

기술적으로 생성자는 이 아닌을 무시합니다. 왜냐하면 생성자는 처음부터 상속되지 않았기 때문입니다.

serialVersionUID에 대한 설명은 this question을 참조하십시오. 당신이 어떤 것을 serialize하지 않는다면, 그것에 대해 신경 쓸 필요가 없습니다.

관련 문제