2011-10-06 4 views
2

짧은 형식 : 오버라이드 된 메서드가 예외를 throw하지 않을 때 예외를 throw하는 방법 (또는 멋진 예외 처리를 수행하거나 중지하려면 강제로 실행을 중지하는 방법) ?오버라이드 된 메서드가 예외를 throw하지 않을 때 예외 처리

컨텍스트 : 우리는 Java "매크로"를 사용하여 자동화 할 수있는 독점 소프트웨어 라이센스를 보유하고 있습니다. 사용자 정의 된 매크로이 형식이어야

public class MyMacro extends SoftwareMacro { 
    public void execute() { 
     // user code goes here 
    } 
} 

SoftwareMacro 익스텐트 그 기본 클래스 '를 겹쳐 executeexecute라는 메소드가 클래스. 이 덮어 쓰기 내용은 execute이며 매크로가 "재생"될 때 실행됩니다.

그러나 재정의 된 execute 메서드는 예외를 throw하지 않습니다.

execute() in com.mycompany.mypackage.MyMacro cannot implement execute() in 
somesoftware.base.SoftwareMacro 
overridden method does not throw java.lang.Exception 

아마이 순진하지만, 개발하는 동안 나는 보통 내가 그들을보고 디버깅에 갈 수 있도록 중지 상단과 힘 실행까지 적절한 예외 유형 거품을 좋아합니다. 이것은 분명히 여기에 옵션이 아닙니다.

대신 RuntimeException을 던집니다. (RuntimeException가 지정 될 필요가 없기 때문에) 그것은 기본 클래스 방법 contracy의 "정신적 위반"을 약간 거추장스럽게 느낀다.

P. 아니요, 재정의 된 execute 메소드의 소스 코드를 변경할 수 없습니다.

+0

하는 깨끗한 방법은 내부에서 예외의 '인상'을 감지 할 중앙 '예외'핸들러를 가지고하는 것입니다 재정의 메서드 및 응용 프로그램 실행을 중단합니다. 실용적인 방법은 RuntimeException을 던지는 것입니다. – mcfinnigan

+0

@DaveHowes - 예, 잘못 읽었습니다. 죄송합니다. Java는 재정의 메소드의 예외 사양이 재정의 된 메소드의 적절한 하위 집합이되도록 요구합니다. 빈 세트는 당연히 적절한 부분 집합입니다. 슈퍼 클래스가하는 동일한 예외를 throw하지 않아도됩니다. –

답변

4

그 의도는 각각 SoftwareMacro은 모든 자체 오류 처리를 수행한다는 것입니다. 필요한 경우 전체 전체 execute() 메서드를 사용하지만 예외가 발생하지 않도록하십시오. execute 메소드 내에서 수행해야하는 정리 작업을 수행하고, 그렇게 할 수있는 방법을 제공하는 경우 사용자에게 오류 메시지를 출력 할 수 있습니다.

제공되는 모든 API를 검사해야합니다. 사용하고있는 오류보고 기능이있을 수 있습니다.

0

execute 코드가 예외를 수용하지 않는 한, 예외가 발생하는 경우 코드가 예외를 수용하지 않는 한 계속 던져 버립니다. 던져진 예외의 종류가 RuntimeException이거나 RuntimeException의 하위 클래스 인 경우 명시 적으로 선언 할 필요가 없습니다. 주로 컴파일러가 (이름에서 알 수있는 것처럼) 런타임에만 발생하기 때문에 선언을 시행하지 않기 때문에 은 반드시입니다. 컴파일시 예측됩니다.

그러나 수정할 수 없다고 말한 execute 메서드는 예외를 흡수하고 로그 항목, 반환 값 또는 어떤 종류의 예외를 나타내지 않습니다. RuntimeException 운이 좋다.

Ernest와 동의하는 것은 execute 메서드가 모든 자체 예외 처리를 수행한다는 것입니다.

참고 : 재정의 된 메서드 서명은 throw하는 예외 (이름, 반환 형식 및 목록 & 변수 유형)와 정확히 일치 할 필요는 없습니다.

+0

음, 아니, 정확히 일치하지는 않지만 재정의 된 메서드는 재정의 된 메서드의 지정된 예외의 하위 집합 (및 수퍼 집합은 예외)을 throw하는 것으로 제한됩니다. –

4

모두는 "매크로 플레이어"가 런타임 예외가 발생하는 경우와 수행하려는 작업에 따라 다릅니다.

전혀 처리하지 않더라도 상관 없으면 RuntimeException을 발생시킵니다.

제대로 처리하는 경우 RuntimeException을 발생시킵니다.

제대로 처리하지 못하고 비참하게 실패하지 않으려면 execute 메소드에서 발생할 수있는 예외를 잡아서 가장 좋은 느낌으로 처리하십시오. 오류 대화 상자 표시 상자에 오류 메시지를 출력하고 로그에 오류를 기록하십시오 ...

1

"해야 할 것"은 정답이 있으며, IMO가없는 것이 어떤 것이지   귀하의 필요에 맞는 것을하십시오.

시스템이 런타임 예외를 허용 할 수 있고 사용자의 요구를 충족 시키는데 왜 그렇지 않은가?

확인 예외를 throw 할 수 없기 때문에 선택의 여지가 없습니다.

(필자는 의욕을 이해하지만 검사 예외 나에게 실패한 실험처럼 보인다.)

+0

글쎄, 나는 좋은 습관과 좋은 습관을 채택하려고 노력하고 있는데, 그것은 "should"에 의해 함축되어있다. 나는 나의 즉각적인 필요를 충족시키는 것보다 더 먼 미래를 찾고있다. –

+0

@ Jean-FrançoisCorbett 좋은 습관은 ... 좋은 일이지만, 당신이하려는 일의 필요를 충족시킬 때만 가능합니다. 분명히 작성자들은 모든 오류 처리가 매크로 내에서 이루어져야한다고 믿고 있으며, 적절할 수도 있습니다 - 문맥에 따라 다릅니다. 그러나 프레임 워크 별 예외 서명을 제공하지 않으면 사용자를 감금하게됩니다. Ernest가 말한 것을 고려해보십시오. 오류를보고하기위한 프레임 워크 메커니즘이 있습니까? 또한 시스템이 실제로 * 중지 *하지 않더라도 시험을 위해 예외를 기록 할 수 있습니다. –

관련 문제