(늦은 편집 :. 자바 7이 때문에 "final rethrow" featureseems like it will be added의, 때이 질문은 희망 폐기 될 예정입니다) 종종내 안전한 전복은 얼마나 안전한가요?
,이처럼 보이는 상황에서 자신을 찾을 :
C#에서do some initialization try { do some work } catch any exception { undo initialization rethrow exception }
당신은 이런 식으로 작업을 수행 할 수 있습니다
InitializeStuff();
try
{
DoSomeWork();
}
catch
{
UndoInitialize();
throw;
}
Java의 경우에는 대체 할만한 것이 없으며 the proposal for improved exception handling was cut from Java 7 이후로 우리가 뭔가를 얻을 때까지 몇 년이 걸리는 것처럼 보입니다.
(편집 : :. 반 년 후, final rethrow is back가, 또는 그렇게 보인다)
public final class Rethrow {
private Rethrow() { throw new AssertionError("uninstantiable"); }
/** Rethrows t if it is an unchecked exception. */
public static void unchecked(Throwable t) {
if (t instanceof Error)
throw (Error) t;
if (t instanceof RuntimeException)
throw (RuntimeException) t;
}
/** Rethrows t if it is an unchecked exception or an instance of E. */
public static <E extends Exception> void instanceOrUnchecked(
Class<E> exceptionClass, Throwable t) throws E, Error,
RuntimeException {
Rethrow.unchecked(t);
if (exceptionClass.isInstance(t))
throw exceptionClass.cast(t);
}
}
일반적인 사용 :
public void doStuff() throws SomeException {
initializeStuff();
try {
doSomeWork();
} catch (Throwable t) {
undoInitialize();
Rethrow.instanceOrUnchecked(SomeException.class, t);
// We shouldn't get past the above line as only unchecked or
// SomeException exceptions are thrown in the try block, but
// we don't want to risk swallowing an error, so:
throw new SomeException("Unexpected exception", t);
}
private void doSomeWork() throws SomeException { ... }
}
는 그것은이다 그래서 난 내 자신의 롤 결정 보통 Throwable
을 붙잡는 것은 보통 눈살을 찌푸리게합니다. 나는 예외를 되돌리기 위해 반사를 사용하는 것에 정말로 만족하지 않습니다. 그리고 나는 항상 약간의 불안감을 느낍니다. "이것은 일어나지 않을 것입니다"라고 말하지만 실제로는 작동합니다. ell (또는 적어도 보인다). 내가 궁금해하는 것은 :
- 내 재사용 도우미 메서드에 결함이 있습니까? 내가 놓친 몇 가지 코너 사례가 있습니까? (나는
Throwable
이 뭔가 심각한 것으로 인해 내undoInitialize
이 실패 할 수도 있지만, 괜찮다고 알고 있습니다.).- 누군가 이미 이것을 발명 했습니까? Commons Lang의
ExceptionUtils
을 살펴 봤지만 다른 것들도 마찬가지입니다.
편집
- 누군가 이미 이것을 발명 했습니까? Commons Lang의
finally
내가 찾고 있어요 드로이드 없습니다. 나는 예외가 던져 질 때만 물건을 다루는 것에 관심이있다.- 예, 나는 잡기가
Throwable
은 큰 노 - 아니,하지만 그것은 덜 악마 여기에 동일한 코드와 함께 세 catch 섹션 (Error
,RuntimeException
및SomeException
각각)에 비해 생각합니다. - 나는 오류를 억누르려고하지 않는다는 것을 알아 두십시오 - 아이디어는
try
블록에 던져진 예외가 몇 가지를 되 감아 자마자 호출 스택을 통해 거품을 일으키기 시작한다는 것입니다.
Throwable 잡기에 대한 좋은 근거가 있습니다. 그것이 당신을 실망시키지 않도록하십시오. GOTO를 사용하는 것과 매우 흡사합니다. "사용하지 않으면 사용하지 마십시오." –