मुझे वास्तव में स्केल 2.10 में scala.util.Try
पसंद है, और यह समझने के साथ कैसे काम करता है कई चरणों को संभालने में आसानी से गलत हो सकता है।scala.util के साथ समझने के लिए त्वरित विफलता।
उदाहरण के लिए, हम यह सुनिश्चित करने के लिए निम्न कोड का उपयोग कर सकते हैं कि हम केवल दो संख्याओं को प्रिंट करें यदि केवल और यदि सबकुछ नियंत्रण में है और हमें मूल्य सही तरीके से मिलता है।
def tryA: Try[Int] = {....}
def tryB: Try[Int] = {....}
for {
a <- tryA
b <- tryB
} {
println (s"We got:${a+b}")
}
लेकिन मेरी चिंता यह है कि इस कोड को वास्तव में किसी भी अपवाद की अनदेखी कर रहा है, जिसका अर्थ है कि यह होगा निम्नलिखित कोशिश cactch ब्लॉक की तरह दिखता है:
try {
// .....
} catch {
case _: Exception => // Swallow any exception
}
जहाँ तक मुझे पता है, वहाँ है एक तर्क है कि इस तरह के कोड खराब गंध है, क्योंकि कोई भी नोटिस नहीं करेगा कि एक अपवाद होता है।
मैं क्या प्राप्त करने के लिए चाहते हैं कि अभी भी for
का उपयोग कर यकीन है कि अगर सब कुछ ठीक है println
केवल निष्पादित, लेकिन अगर कोई चरणों में किसी भी अपवाद नहीं है, यह उड़ा और सीधे अपवाद बाहर फेंक होगा बनाना है।
वर्तमान में यह है कि मैं यह कैसे करता हूं, लेकिन यह कम सुरुचिपूर्ण लगता है क्योंकि यह एक नया Try[Unit]
ऑब्जेक्ट पेश करता है, इसलिए मैं सोच रहा हूं कि मैं यह कोड कैसे बेहतर बना सकता हूं?
उदाहरण के लिए, result
चर और result.get
कथन से छुटकारा पाने के लिए संभव है, लेकिन फिर भी अपवाद को फेंक दिया जा सकता है?
def tryA: Try[Int] = {....}
def tryB: Try[Int] = {....}
val result = for {
a <- tryA
b <- tryB
} yield {
println (s"We got:${a+b}")
}
result.get
अद्यतन
बात को और अधिक स्पष्ट करने के लिए, यह इस प्रश्न के पहले कोड की स्काला आरईपीएल से परिणाम है।
scala> def tryA: Try[Int] = Success(1)
tryA: scala.util.Try[Int]
scala> def tryB: Try[Int] = Failure(new Exception("error"))
tryB: scala.util.Try[Int]
scala> for {
| a <- tryA
| b <- tryB
| } {
| println (s"We got:${a+b}")
| }
scala>
हम कि कुछ भी नहीं देख सकते हैं यहां होता, यहां तक कि tryB
अपवाद के साथ एक Failure
है। मैं जो प्राप्त करना चाहता हूं वह एक अपवाद फेंक दिया गया है, और नए Try[Unit]
ऑब्जेक्ट को yield
के साथ पेश किए बिना, क्या यह संभव है?
'println' का प्रकार' यूनिट 'है, इसलिए' परिणाम 'या तो अपवाद फेंक देगा या' यूनिट 'मान, '()' वापस करेगा। –
नहीं, यह तब तक अपवाद नहीं फेंक देगा जब तक कि मैं 'get' विधि का उपयोग नहीं करता। –
आपके नमूना कोड में बिना शर्त 'result.get' शामिल है। (मेरा पहला टिप्पणी में 'result.get' लिखना था ...) –