2012-05-24 10 views
33

संभव डुप्लिकेट:
Is it possible to detect if an exception occurred before I entered a finally block?एक अंत में ब्लॉक में, मैं बता सकते हैं कि एक अपवाद फेंका जा चुका है

मैं एक कार्यप्रवाह विधि है कि काम करता है, और एक अपवाद है, तो एक फेंकता त्रुटि हुई। मैं अपने वर्कफ़्लो में रिपोर्टिंग मीट्रिक जोड़ना चाहता हूं। अंततः नीचे ब्लॉक में, क्या यह बताने का कोई तरीका है कि कोशिश/पकड़ ब्लॉक में से किसी एक तरीके ने अपवाद फेंक दिया है?

मैं अपना खुद का पकड़/फेंक कोड जोड़ सकता हूं, लेकिन एक क्लीनर समाधान पसंद करूंगा क्योंकि यह एक ऐसा पैटर्न है जिसे मैं अपने प्रोजेक्ट में पुन: उपयोग कर रहा हूं।

@Override 
public void workflowExecutor() throws Exception { 
    try { 
     reportStartWorkflow(); 
     doThis(); 
     doThat(); 
     workHarder(); 
    } finally { 
     /** 
     * Am I here because my workflow finished normally, or because a workflow method 
     * threw an exception? 
     */ 
     reportEndWorkflow(); 
    } 
} 
+1

यह प्रश्न सुझाए गए एक का डुप्लिकेट हो सकता है, लेकिन यह कहना मुश्किल है, क्योंकि दूसरा सवाल काफी सराहनीय है। आखिरकार ब्लॉक को नियंत्रित करने की क्षमता को अवरुद्ध कर दिया गया है कि क्या ब्लॉक नियंत्रण के सामान्य प्रवाह में निष्पादित हो रहा है या फेंकने वाले अपवाद के कारण अत्यधिक उपयोगी होगा क्योंकि यह लेनदेन प्रसंस्करण को सरल बना देगा; हां, न तो जावा और न ही सी # वर्तमान में इस क्षमता को afaik प्रदान करते हैं। शर्म की बात है। –

उत्तर

47

जावा द्वारा प्रदान किया गया कोई स्वचालित तरीका नहीं है। आप एक बूलियन ध्वज का उपयोग कर सकते हैं:

boolean success = false; 
try { 
    reportStartWorkflow(); 
    doThis(); 
    doThat(); 
    workHarder(); 
    success = true; 
} finally { 
    if (!success) System.out.println("No success"); 
} 
3

आप वहां हैं क्योंकि आपके प्रयास-ब्लॉक ने निष्पादन पूरा कर लिया है। चाहे कोई अपवाद फेंक दिया गया हो या नहीं।

जब एक अपवाद होते हैं के बीच या कि क्या आपके विधि प्रवाह निष्पादन को सफलतापूर्वक पूरा भेद करने के लिए, आप कुछ इस तरह कर रही कोशिश कर सकते: में एक बार reportEndWorkflow में दो बार catch ब्लॉक में कहते हैं, एक बार और:

boolean isComplete = false; 
try 
{ 
    try 
    { 
    reportStartWorkflow(); 
    doThis(); 
    doThat(); 
    workHarder(); 
    isComplete = true; 
    } 
    catch (Exception e) 
    {} 
} 
finally 
{ 
    if (isComplete) 
    { 
    // TODO: Some routine 
    } 
} 
5

दो समाधान try के अंत:

try { 
    // ... 
    reportEndWorkflow("success"); 
} catch (MyException ex) { 
    reportEndWorkflow("failure"); 
} 

या आप एक बूलियन चर लागू कर सकते हैं:

boolean finished = false; 
try { 
    // ... 
    finished = true; 
} finally { 
    // ... 
} 
संबंधित मुद्दे