कुछ इस तरह एक अच्छा विचार है, लेकिन मैं इसे एक विधि बनाने चाहते हैं:
def cleanly[A,B](resource: => A)(cleanup: A => Unit)(code: A => B): Option[B] = {
try {
val r = resource
try { Some(code(r)) }
finally { cleanup(r) }
} catch {
case e: Exception => None
}
}
(ध्यान दें कि हम केवल एक बार पकड़ने, तुम वास्तव में संदेश एक मामले और नहीं में मुद्रित करना चाहते हैं दूसरा, तो आपको दोनों की तरह पकड़ना होगा)।
cleanly(new FileOutputStream(path))(_.close){ fos =>
Iterator.continually(in.read).takeWhile(_ != -1).foreach(fos.write)
}
चूंकि यह एक मान देता है, तो आप एक मिल जाएगा: विधि इतनी तरह प्रयोग किया जाता है, (, पकड़ने Error
भी आम तौर पर मूर्ख है, क्योंकि यह से उबरने के लिए लगभग असंभव है यह भी ध्यान रखें कि मैं केवल अपवाद को पकड़ने के।) Some(())
यदि यह यहां सफल हुआ (जिसे आप अनदेखा कर सकते हैं)।
संपादित करें: यह अधिक सामान्य बनाना, मैं वास्तव में यह एक Either
बजाय लौट होगा, ताकि आप अपवाद मिलता है। इसलिए जैसा:
def cleanly[A,B](resource: => A)(cleanup: A => Unit)(code: A => B): Either[Exception,B] = {
try {
val r = resource
try { Right(code(r)) } finally { cleanup(r) }
}
catch { case e: Exception => Left(e) }
}
अब अगर आप एक Right
मिलता है, सब ठीक हो गया। यदि आपको Left
मिलता है, तो आप अपना अपवाद चुन सकते हैं। यदि आपको अपवाद की परवाह नहीं है, तो आप इसे .right.toOption
का उपयोग किसी विकल्प में मैप करने के लिए कर सकते हैं, या केवल .right.map
का उपयोग कर सकते हैं या जो भी सही परिणाम पर संचालित हो, केवल तभी होता है (जैसे Option
)। (पैटर्न मिलान Either
एस से निपटने का एक उपयोगी तरीका है।)
स्रोत
2012-01-14 22:47:27
(बस
tryclose._
औरtryclose.JavaImplicits._
आयात करने के लिए सुनिश्चित करें) पहले व्यक्ति सफलतापूर्वक तत्काल, मैं अंततः एक पैटर्न पर मारा जो मेरे लिए बहुत उपयोगी रहा है। मैंने इसे समान स्टैक ओवरफ्लो प्रश्न पर एक उत्तर के रूप में लिखा: http://stackoverflow.com/a/34277491/501113 – chaotic3quilibrium