उत्तर

118

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

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 बुलाया पैटर्न विकल्पों को देखें।

25

आप पकड़ खंड में स्केला की क्षमताओं से मेल खाते पूर्ण पैटर्न के लिए उपयोग किया रूप में, आप बहुत कुछ कर सकते: वहाँ सी # की तुलना में एक बेहतर तरीका है

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") 
} 
+0

दिलचस्प, मैंने पैटर्न पैटर्न पहले नहीं देखा है। मुझे लगता है कि वे [पिनएस] में शामिल नहीं हैं (http://www.artima.com/shop/programming_in_scala_2ed)। – kassens

+1

एक पैटर्न वैकल्पिक कार्यों को बाध्यकारी, और विशेष रूप से इस मामले में उपयोगी है। बाध्य चर भी विकल्प के सबसे विशिष्ट सामान्य supertypes प्रकार के रूप में मिलता है। नेस्टिंग मार्कर अनावश्यक है। यदि आप इसे कहकर अपडेट करते हैं तो मैं आपके उत्तर को ऊपर उठाऊंगा। –

+0

@ जीन-फिलिप: बढ़िया !! मैंने जवाब देने से पहले कोशिश की और वह काम नहीं कर सका। शायद बहुत तेज़ी से जांच कर, मैंने सोचा कि यह वही कहा गया है (पृष्ठ 113 विकल्प पैटर्न है और आप केवल पैटर्न 3 पर बाध्य कर सकते हैं)। वाक्यविन्यास क्या है? –

14

तुम भी 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") 
} 

इस विशिष्ट उदाहरण सबसे अच्छा उदाहरण वर्णन करने के लिए आप इसे कैसे उपयोग कर सकते हैं नहीं हो सकता है, लेकिन मैं इसे बहुत कई अवसरों में उपयोगी पाते हैं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^