ग्रूवी - अपवाद हैंडलिंग
रनटाइम त्रुटियों को संभालने के लिए किसी भी प्रोग्रामिंग भाषा में अपवाद हैंडलिंग की आवश्यकता होती है ताकि आवेदन के सामान्य प्रवाह को बनाए रखा जा सके।
अपवाद सामान्य रूप से अनुप्रयोग के सामान्य प्रवाह को बाधित करता है, यही कारण है कि हमें अपने आवेदन में अपवाद हैंडलिंग का उपयोग करने की आवश्यकता है।
अपवादों को मोटे तौर पर निम्नलिखित श्रेणियों में वर्गीकृत किया जाता है -
Checked Exception - रनटाइम एक्सेप्शन और एरर को छोड़कर थ्रोबेबल क्लास को विस्तारित करने वाली कक्षाओं को चेक किए गए अपवादों के रूप में जाना जाता है। उदाहरण के लिए, SQLException आदि चेक किए गए अपवादों को संकलन-समय पर जांचा जाता है।
एक शास्त्रीय मामला FileNotFoundException है। मान लीजिए कि आपके पास निम्नलिखित कोड है जो आपके एप्लिकेशन को ई ड्राइव में एक फ़ाइल से पढ़ता है।
class Example {
static void main(String[] args) {
File file = new File("E://file.txt");
FileReader fr = new FileReader(file);
}
}
यदि E ड्राइव में फ़ाइल (file.txt) नहीं है, तो निम्न अपवाद उठाया जाएगा।
पकड़ा गया: java.io.FileNotFoundException: E: \ file.txt (सिस्टम निर्दिष्ट फ़ाइल नहीं ढूँढ सकता)।
java.io.FileNotFoundException: E: \ file.txt (सिस्टम निर्दिष्ट फ़ाइल नहीं ढूँढ सकता)।
Unchecked Exception - RuntimeException का विस्तार करने वाले वर्गों को अनियंत्रित अपवाद के रूप में जाना जाता है, उदाहरण के लिए, ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException आदि। अनियंत्रित अपवादों को संकलन-समय पर चेक नहीं किया जाता है, बल्कि उन्हें रनटाइम पर चेक किया जाता है।
एक शास्त्रीय मामला ArrayIndexOutOfBoundsException है, जो तब होता है जब आप किसी सरणी के सूचकांक तक पहुंचने का प्रयास करते हैं जो सरणी की लंबाई से अधिक है। निम्नलिखित इस तरह की गलती का एक विशिष्ट उदाहरण है।
class Example {
static void main(String[] args) {
def arr = new int[3];
arr[5] = 5;
}
}
जब उपरोक्त कोड निष्पादित किया जाता है तो निम्न अपवाद उठाया जाएगा।
पकड़ा गया: java.lang.ArrayIndexOutOfBoundsException: 5
java.lang.ArrayIndexOutOfBoundsException: 5
Error - त्रुटि अपरिवर्तनीय है जैसे OutOfMemoryError, VirtualMachineError, AssertionError आदि।
ये वे त्रुटियां हैं जिनसे प्रोग्राम कभी उबर नहीं सकता है और इससे प्रोग्राम क्रैश हो जाएगा।
निम्नलिखित आरेख से पता चलता है कि ग्रूवी में अपवादों के पदानुक्रम का आयोजन कैसे किया जाता है। यह सब जावा में परिभाषित पदानुक्रम पर आधारित है।
पकड़ने के अपवाद
एक विधि एक संयोजन का उपयोग करके एक अपवाद को पकड़ती है try तथा catchकीवर्ड। कोड के आसपास एक कोशिश / कैच ब्लॉक रखा गया है जो एक अपवाद उत्पन्न कर सकता है।
try {
//Protected code
} catch(ExceptionName e1) {
//Catch block
}
आपके सभी कोड जो एक अपवाद को बढ़ा सकते हैं, को संरक्षित कोड ब्लॉक में रखा गया है।
कैच ब्लॉक में, आप अपने अपवाद को संभालने के लिए कस्टम कोड लिख सकते हैं ताकि एप्लिकेशन अपवाद से पुनर्प्राप्त हो सके।
आइए एक समान कोड के एक उदाहरण को देखें, जो हमने एक इंडेक्स मान के साथ एक सरणी तक पहुंचने के लिए देखा था, जो कि सरणी के आकार से अधिक है। लेकिन इस बार चलो एक कोशिश / पकड़ ब्लॉक में हमारे कोड को लपेटते हैं।
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
} catch(Exception ex) {
println("Catching the exception");
}
println("Let's move on after the exception");
}
}
जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -
Catching the exception
Let's move on after the exception
उपरोक्त कोड से, हम कोशिश ब्लॉक में दोषपूर्ण कोड को लपेटते हैं। कैच ब्लॉक में हम केवल अपने अपवाद को पकड़ रहे हैं और एक संदेश को आउटपुट कर रहे हैं कि एक अपवाद उत्पन्न हुआ है।
एकाधिक पकड़ ब्लॉक
कई प्रकार के अपवादों को संभालने के लिए एक से अधिक कैच ब्लॉक हो सकते हैं। प्रत्येक कैच ब्लॉक के लिए, उठाए गए अपवाद के प्रकार के आधार पर आप तदनुसार कोड संभालेंगे।
विशेष रूप से ArrayIndexOutOfBoundsException को पकड़ने के लिए हमारे उपरोक्त कोड को संशोधित करें। निम्नलिखित कोड स्निपेट है।
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
}catch(ArrayIndexOutOfBoundsException ex) {
println("Catching the Array out of Bounds exception");
}catch(Exception ex) {
println("Catching the exception");
}
println("Let's move on after the exception");
}
}
जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -
Catching the Aray out of Bounds exception
Let's move on after the exception
उपरोक्त कोड से आप देख सकते हैं कि ArrayIndexOutOfBoundsException कैच ब्लॉक पहले पकड़ा गया है क्योंकि इसका मतलब अपवाद का मानदंड है।
अंत में ब्लॉक करें
finallyब्लॉक एक कोशिश ब्लॉक या कैच ब्लॉक होता है। कोड का एक अंतिम ब्लॉक हमेशा निष्पादित होता है, चाहे एक अपवाद की घटना हो।
अंततः ब्लॉक का उपयोग करने से आप किसी भी क्लीन-टाइप स्टेटमेंट को चला सकते हैं, जिसे आप निष्पादित करना चाहते हैं, भले ही संरक्षित कोड में कुछ भी न हो। इस ब्लॉक का सिंटैक्स नीचे दिया गया है।
try {
//Protected code
} catch(ExceptionType1 e1) {
//Catch block
} catch(ExceptionType2 e2) {
//Catch block
} catch(ExceptionType3 e3) {
//Catch block
} finally {
//The finally block always executes.
}
आइए हमारे उपरोक्त कोड को संशोधित करें और अंत में कोड को ब्लॉक करें। निम्नलिखित कोड स्निपेट है।
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
} catch(ArrayIndexOutOfBoundsException ex) {
println("Catching the Array out of Bounds exception");
}catch(Exception ex) {
println("Catching the exception");
} finally {
println("The final block");
}
println("Let's move on after the exception");
}
}
जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -
Catching the Array out of Bounds exception
The final block
Let's move on after the exception
ग्रूवी में उपलब्ध अपवाद तरीके निम्नलिखित हैं -
सार्वजनिक स्ट्रिंग getMessage ()
अपवाद के बारे में एक विस्तृत संदेश देता है। यह संदेश थ्रेडेबल कंस्ट्रक्टर में आरंभिक है।
सार्वजनिक फेंकने योग्य getCause ()
अपवाद का कारण देता है जैसा कि एक थ्रोबेबल ऑब्जेक्ट द्वारा दर्शाया गया है।
सार्वजनिक स्ट्रिंग toString ()
GetMessage () के परिणाम के साथ सम्मिलित वर्ग का नाम लौटाता है
सार्वजनिक शून्य प्रिंटस्ट्रेस ()
System.err, त्रुटि आउटपुट स्ट्रीम में स्टैक ट्रेस के साथ () स्ट्रिंग के परिणाम को प्रिंट करता है।
सार्वजनिक StackTraceElement [] getStackTrace ()
स्टैक ट्रेस पर प्रत्येक तत्व युक्त एक सरणी देता है। इंडेक्स 0 का तत्व कॉल स्टैक के शीर्ष का प्रतिनिधित्व करता है, और सरणी में अंतिम तत्व कॉल स्टैक के निचले भाग में विधि का प्रतिनिधित्व करता है।
सार्वजनिक फेंकने योग्य fillInStackTrace ()
स्टैक ट्रेस में किसी भी पिछली जानकारी को जोड़ने के साथ, वर्तमान स्टैक ट्रेस के साथ इस थ्रेडेबल ऑब्जेक्ट के स्टैक ट्रेस को भरता है।
उदाहरण
नीचे दिए गए कुछ तरीकों का उपयोग करके कोड उदाहरण दिया गया है -
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
}catch(ArrayIndexOutOfBoundsException ex) {
println(ex.toString());
println(ex.getMessage());
println(ex.getStackTrace());
} catch(Exception ex) {
println("Catching the exception");
}finally {
println("The final block");
}
println("Let's move on after the exception");
}
}
जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -
java.lang.ArrayIndexOutOfBoundsException: 5
5
[org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayPutAtMetaMethod$MyPojoMetaMet
hodSite.call(IntegerArrayPutAtMetaMethod.java:75),
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) ,
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) ,
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) ,
Example.main(Sample:8), sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93),
groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325),
groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1443),
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:893),
groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:287),
groovy.lang.GroovyShell.run(GroovyShell.java:524),
groovy.lang.GroovyShell.run(GroovyShell.java:513),
groovy.ui.GroovyMain.processOnce(GroovyMain.java:652),
groovy.ui.GroovyMain.run(GroovyMain.java:384),
groovy.ui.GroovyMain.process(GroovyMain.java:370),
groovy.ui.GroovyMain.processArgs(GroovyMain.java:129),
groovy.ui.GroovyMain.main(GroovyMain.java:109),
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:109),
org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:131),
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)]
The final block
Let's move on after the exception