मैं उन कार्यों में आया हूं जो Future
लौटाते हैं लेकिन तुरंत अपवाद भी फेंक देते हैं। इस तरह उदाहरण के लिए:क्या फ़ंक्शन [ए] फेंकने वाले अपवादों को फेंकना चाहिए?
def func(): Future[String] {
if (something) {
// this
Future.failed(new RuntimeException("test"))
} else {
// and this
throw new RuntimeException("test")
}
}
यह व्यवहार फोन करने वाले के लिए कष्टप्रद लगता है, क्योंकि आप दोनों त्रुटियों को पकड़ने के लिए कुछ इस तरह करना है:
try {
func() recover {
case e: Exception => handleError(e)
}
} catch {
case e: Exception => Future.successful(handleError(e)) //or Future.failed etc
}
मैं देखा है कि खेलने के ढांचे में WSClient
करता है यह (यूआरएल खराब होने पर अपवाद फेंक रहा है, और Future
लौटा रहा है जो HTTP अनुरोध विफल होने पर विफल रहता है)।
क्या यह अच्छा अभ्यास है? क्या इस तरह व्यवहार करने वाले कार्यों से त्रुटियों को संभालने का कोई बेहतर तरीका है?
नहीं, अपवादों का उपयोग करने के लिए यह अच्छा अभ्यास नहीं है - http://programmers.stackexchange.com/questions/223329/side-effects-breaking-referential-transparency। शायद 'भविष्य [या तो [ए, बी]] का उपयोग करके आप करेंगे - https://www.reddit.com/r/scala/comments/3r5ii6/on_handling_futureeithera_b_sequencing/। –
@ केविन मैरिडिथ मैं अपेक्षित त्रुटियों के लिए 'या तो [ए, बी]' का उपयोग करके समझता हूं, यहां मेरी समस्या यह नहीं है कि उनको कैसे अंतर किया जाए, लेकिन क्या किसी फ़ंक्शन को अपवाद फेंकना चाहिए और अप्रत्याशित विफलता के लिए असफल वायदा वापस करना चाहिए (ऐसा लगता है कि उन्हें नहीं होना चाहिए)। –