(देर संपादित करें:। यह सवाल उम्मीद है कि अप्रचलित हो जाएगा जब जावा 7 "final rethrow" feature जो seems like it will be added की वजह से आता है)मेरा सुरक्षित पुनर्स्थापन कितना सुरक्षित है?
अक्सर
, मैं अपने आप को इस तरह देख स्थितियों में मिल:
do some initialization try { do some work } catch any exception { undo initialization rethrow exception }
सी # में आप इस तरह यह कर सकते हैं:
InitializeStuff();
try
{
DoSomeWork();
}
catch
{
UndoInitialize();
throw;
}
जावा के लिए, कोई अच्छा प्रतिस्थापन नहीं है, और 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
असफल हो जायेगी की वजह से किया गया हो सकता है, लेकिन यह ठीक है।)- कोई पहले से ही इस आविष्कार किया गया है? मैंने कॉमन्स लैंग के
ExceptionUtils
को देखा लेकिन यह अन्य चीजें करता है।
- कोई पहले से ही इस आविष्कार किया गया है? मैंने कॉमन्स लैंग के
संपादित करें:
finally
ड्रायड मैं तलाश कर रहा हूँ नहीं है। अपवाद फेंकने पर मुझे केवल सामान करने में दिलचस्पी है।- हाँ, मैं पकड़ने पता
Throwable
है एक बड़ा नहीं-नहीं, लेकिन मुझे लगता है कि कम बुराई यहाँ तीन कैच खंड समान कोड के साथ (Error
,RuntimeException
औरSomeException
, क्रमशः के लिए) होने की तुलना में है। - ध्यान दें कि मैं किसी भी त्रुटि को दबाने की कोशिश नहीं कर रहा हूँ - विचार यह है कि किसी भी अपवाद
try
ब्लॉक में फेंक दिया बुलबुला अप करने के लिए कॉल स्टैक के माध्यम से जैसे ही मुझे कुछ चीजें rewinded किया है जारी रहेगा है।
आपके पास थ्रोबल को पकड़ने के लिए एक अच्छा तर्क है। इसे नीचे जाने मत दो। यह गोटो के उपयोग की तरह है, "इसका उपयोग कभी न करें, जब तक आपको करना न पड़े।" –