स्कैला में एक बार में कई अपवाद कैसे प्राप्त करें? Catch multiple exceptions at once?स्कैला में एक बार में कई अपवादों को पकड़ना
उत्तर
आप इस प्रकार का चर करने के लिए पूरे पैटर्न बाध्य कर सकते हैं:
try {
throw new java.io.IOException("no such file")
} catch {
// prints out "java.io.IOException: no such file"
case e @ (_ : RuntimeException | _ : java.io.IOException) => println(e)
}
the Scala Language Specification page 118 paragraph 8.1.11 बुलाया पैटर्न विकल्पों को देखें।
आप पकड़ खंड में स्केला की क्षमताओं से मेल खाते पूर्ण पैटर्न के लिए उपयोग किया रूप में, आप बहुत कुछ कर सकते: वहाँ सी # की तुलना में एक बेहतर तरीका है
try {
throw new IOException("no such file")
} catch {
case _ : SQLException | _ : IOException => println("Resource failure")
case e => println("Other failure");
}
ध्यान दें कि आप की जरूरत है लिखना एक ही संचालकों बार-बार आपको लगता है कि के लिए अपने स्वयं के नियंत्रण संरचना बना सकते हैं:
def onFilesAndDb(code: => Unit) {
try {
code
} catch {
your handling code
}
}
इस तरह के कुछ तरीकों वस्तु scala.util.control.Exceptions में उपलब्ध हैं। असफल, असफल, असफल, हैंडलिंग केवल आपको चाहिए
संपादित करें: नीचे जो कहा गया है उसके विपरीत, वैकल्पिक पैटर्न बाध्य किए जा सकते हैं, इसलिए प्रस्तावित समाधान अनिवार्य रूप से जटिल है। देखें @agilesteel समाधान
दुर्भाग्य से, इस समाधान के साथ, आपके पास वैकल्पिक पैटर्न का उपयोग करने वाले अपवाद तक कोई पहुंच नहीं है। मेरे ज्ञान के लिए, आप e @ (_ : SqlException | _ : IOException)
के साथ वैकल्पिक पैटर्न पर बाध्य नहीं कर सकते हैं। तो अगर आप अपवाद के लिए उपयोग की जरूरत है, तो आप घोंसला matchers करने के लिए है:
try {
throw new RuntimeException("be careful")
} catch {
case e : RuntimeException => e match {
case _ : NullPointerException | _ : IllegalArgumentException =>
println("Basic exception " + e)
case a: IndexOutOfBoundsException =>
println("Arrray access " + a)
case _ => println("Less common exception " + e)
}
case _ => println("Not a runtime exception")
}
तुम भी scala.util.control.Exception
उपयोग कर सकते हैं:
import scala.util.control.Exception._
import java.io.IOException
handling(classOf[RuntimeException], classOf[IOException]) by println apply {
throw new IOException("foo")
}
इस विशिष्ट उदाहरण सबसे अच्छा उदाहरण वर्णन करने के लिए आप इसे कैसे उपयोग कर सकते हैं नहीं हो सकता है, लेकिन मैं इसे बहुत कई अवसरों में उपयोगी पाते हैं।
दिलचस्प, मैंने पैटर्न पैटर्न पहले नहीं देखा है। मुझे लगता है कि वे [पिनएस] में शामिल नहीं हैं (http://www.artima.com/shop/programming_in_scala_2ed)। – kassens
एक पैटर्न वैकल्पिक कार्यों को बाध्यकारी, और विशेष रूप से इस मामले में उपयोगी है। बाध्य चर भी विकल्प के सबसे विशिष्ट सामान्य supertypes प्रकार के रूप में मिलता है। नेस्टिंग मार्कर अनावश्यक है। यदि आप इसे कहकर अपडेट करते हैं तो मैं आपके उत्तर को ऊपर उठाऊंगा। –
@ जीन-फिलिप: बढ़िया !! मैंने जवाब देने से पहले कोशिश की और वह काम नहीं कर सका। शायद बहुत तेज़ी से जांच कर, मैंने सोचा कि यह वही कहा गया है (पृष्ठ 113 विकल्प पैटर्न है और आप केवल पैटर्न 3 पर बाध्य कर सकते हैं)। वाक्यविन्यास क्या है? –