인터페이스를 사용하는 이유는 구현 세부 사항을 추상화하는 것입니다.
이러한 예외가 발생하면 구현 세부 정보가 노출 될 수 있으므로이를 추상화해야합니다.
아마도 새로운 예외를 정의하는 것이 가장 좋습니다. 그런 다음에 대해 알고있는 예외를 포착하고 대신 새로운 예외를 슬로우 F()의 각 구현은 당신이 줄 수 있도록 :
interface I {
void f() throws MyException;
}
class A implements I {
public void f() throws MyException {
try {
...
} catch (IOException e) {
throw new MyException(e);
}
}
}
class B implements I {
public void f() throws MyException {
try {
...
} catch (InterruptedException e) {
throw new MyException(e);
}
}
}
를 구현 예외를 랩으로, 당신은 여전히 발신자에와 있음을 노출하고 원격 메소드를 호출 할 때 당신을 물 수 있습니다. 이 경우 유용한 정보를 일반적인 방법으로 반환하려면 더 많은 작업을해야합니다.
편집
올바른 접근 방식에 대해 계속 분쟁이 약간있는 것으로 보인다.
I instanceOfI = getI();
try {
instanceOfI.f();
}
catch (/* What should go here ? */)
그것은 catch 블록에 넣어 좋은 예외 클래스입니다 무엇을 내려 오는 : 우리가 F()를 호출 할 때처럼
, 우리는 코드가 필요합니다.
OP의 원래 코드를 사용하면 Exception
을 잡을 수 있으며 요구 사항에 따라 어떤 하위 클래스가 있는지 확인할 수도 있습니다. 또는 각 하위 클래스를 개별적으로 catch 할 수는 있지만 새 구현에서 다른 예외가 발생하면 catch 블록을 추가해야합니다.
런타임 예외를 사용하는 경우 예외가 발생할 가능성을주지 않고 호출자 메소드로 예외 처리를 연기 할 수 있다는 점을 제외하고는 런타임 예외를 많이 사용합니다.
새로운 포장 된 예외 사용 제안을 사용한 경우 MyException
을 붙잡고 추가 정보가 있는지 확인해야합니다. 이것은 본질적으로 Exception을 사용하는 것과 매우 흡사하게되지만, 목적에 맞출 수있는 bespoke
예외를 갖는 제한된 이익을 위해 추가 작업이 필요합니다.
확인 된 예외가 일반적으로 언어 디자인에서 실패한 실험으로 간주되는 가장 큰 이유를 발견했습니다. –
@Michael Borgwardt - 귀하의 의견과 downvote는 주제와 관련이 없습니다. –