async/await Exception Propagation
समझें कि async से exceptions कैसे propagate होती हैं और try-await का उपयोग कब करना चाहिए।
async/await Exception Propagation, CoddyKit पर Kotlin Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Kotlin Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
async अपवादों को संग्रहीत करता है
launch के विपरीत, async अपवाद को लौटाए गए Deferred में संग्रहीत करता है। वह केवल await() कॉल करने पर फिर से छोड़ा जाता है।
import kotlinx.coroutines.*
fun main() = runBlocking {
val deferred = async {
throw RuntimeException("async error")
}
try {
deferred.await() // exception rethrown here
} catch (e: RuntimeException) {
println("Caught: ${e.message}")
}
}await() के बिना अपवाद
यदि आप कभी await() कॉल नहीं करते हैं, तो नियमित Job पैरेंट के साथ अपवाद चुपचाप हट जाता है। supervisorScope + हमेशा await को प्राथमिकता दें।
import kotlinx.coroutines.*
fun main() = runBlocking {
// Exception stored in deferred, never retrieved:
val d = async { throw RuntimeException("lost exception") }
delay(100) // d has failed — exception never surfaced
println("d.isCancelled: ${d.isCancelled}")
}coroutineScope के अंतर्गत async
नियमित coroutineScope के अंतर्गत, यदि कोई async चाइल्ड अपवाद उत्पन्न करता है और वह अपवाद फैलता है, यानी पकड़ा नहीं जाता, तो वह स्कोप और उसके सभी सहोदर चाइल्ड को रद्द कर देता है।
import kotlinx.coroutines.*
fun main() = runBlocking {
try {
coroutineScope {
val a = async { "A" }
val b = async { throw RuntimeException("B failed") }
println(a.await())
println(b.await()) // propagates, cancels scope
}
} catch (e: RuntimeException) {
println("Scope failed: ${e.message}")
}
}supervisorScope के अंतर्गत async
supervisorScope के अंतर्गत, async के अपवाद सहोदर चाइल्ड तक नहीं फैलते। प्रत्येक await()` को अलग-अलग रैप करना आवश्यक है।
import kotlinx.coroutines.*
fun main() = runBlocking {
supervisorScope {
val a = async { "A" }
val b = async { throw RuntimeException("B failed") }
println(a.await())
try { println(b.await()) }
catch (e: RuntimeException) { println("b failed: ${e.message}") }
}
}कई async के लिए awaitAll
awaitAll(d1, d2, d3) सभी deferred का इंतज़ार करता है। यदि इनमें से कोई विफल होता है, तो यह तुरंत अपवाद उत्पन्न करता है और बाकी को रद्द कर देता है।
import kotlinx.coroutines.*
fun main() = runBlocking {
try {
val results = awaitAll(
async { "result1" },
async { throw RuntimeException("task 2 failed") },
async { "result3" }
)
println(results)
} catch (e: Exception) {
println("awaitAll failed: ${e.message}")
}
}async के साथ runCatching
परिणाम और त्रुटियाँ एकत्र करने के लिए, प्रत्येक await() को runCatching में रैप करें, ताकि प्रक्रिया बीच में रुक न जाए।
import kotlinx.coroutines.*
fun main() = runBlocking {
supervisorScope {
val deferreds = listOf(
async { "A" },
async { throw RuntimeException("B") },
async { "C" }
)
val results = deferreds.map { runCatching { it.await() } }
results.forEach { println(it) }
}
}त्रुटियाँ एकत्र करते हुए समानांतर कार्य
समानांतर async कार्यों की सभी विफलताओं को एकत्र करें और तुरंत विफल होने के बजाय उन्हें एक साथ रिपोर्ट करें।
import kotlinx.coroutines.*
fun main() = runBlocking {
val tasks = listOf("a", "b", "c")
val results = supervisorScope {
tasks.map { t ->
async {
if (t == "b") throw RuntimeException("b failed")
t.uppercase()
}
}.map { runCatching { it.await() } }
}
val errors = results.filter { it.isFailure }
val successes = results.mapNotNull { it.getOrNull() }
println("Success: $successes, Errors: ${errors.size}")
}अपवाद के प्रकार को बनाए रखना
async के अंदर उत्पन्न अपवाद अपना प्रकार बनाए रखते हैं। सटीक त्रुटि-प्रबंधन के लिए await() पर विशिष्ट अपवाद प्रकार को पकड़ें।
import kotlinx.coroutines.*
class NetworkException(msg: String) : RuntimeException(msg)
fun main() = runBlocking {
val d = async { throw NetworkException("timeout") }
try {
d.await()
} catch (e: NetworkException) {
println("Network error: ${e.message}")
} catch (e: Exception) {
println("Other error: ${e.message}")
}
}निलंबन के बिना जाँच के लिए Deferred.getCompleted()
join() के बाद, परिणाम को समकालिक रूप से प्राप्त करने के लिए getCompleted() का उपयोग करें। यदि deferred विफल हुआ हो, तो यह अपवाद उत्पन्न करता है।
import kotlinx.coroutines.*
fun main() = runBlocking {
val d = async { 42 }
d.join() // wait without caring about result
try {
val result = d.getCompleted() // synchronous — no suspend
println("Result: $result")
} catch (e: Exception) {
println("Failed: ${e.message}")
}
}संरचित समवर्तीता और async
संरचित समवर्तीता के अंतर्गत, कोई async deferred हमेशा अपने पैरेंट स्कोप से जुड़ा रहता है। स्कोप रद्द होने पर deferred भी रद्द हो जाता है—कोई अनाथ कार्य नहीं रहता।
import kotlinx.coroutines.*
fun main() = runBlocking {
val scope = CoroutineScope(SupervisorJob())
val d = scope.async {
delay(1000)
"result"
}
scope.cancel() // cancels d too
try { d.await() }
catch (e: CancellationException) { println("Cancelled as expected") }
}सर्वोत्तम अभ्यास: हमेशा Await करें
हर async deferred पर हमेशा await() करें, भले ही आपको परिणाम की आवश्यकता न हो। इससे अपवाद सामने आते हैं और चुपचाप होने वाली विफलताएँ रुकती हैं।
import kotlinx.coroutines.*
fun main() = runBlocking {
supervisorScope {
val d = async {
// do background work
"done"
}
// Always await:
val result = runCatching { d.await() }
println(result)
}
}त्वरित जाँच
async { throw ... } ब्लॉक का अपवाद कब सामने आता है?
पुनरावलोकन
async अपवादों को Deferred में संग्रहीत करता है; वे await() पर सामने आते हैं। coroutineScope के अंतर्गत, प्रसार से सहोदर चाइल्ड रद्द हो जाते हैं। supervisorScope के अंतर्गत, हर await को अपनी विफलता स्वयं संभालनी चाहिए। हर deferred पर हमेशा await करें।
एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 51
- पाठ
- 203
अक्सर पूछे जाने वाले प्रश्न
क्या “async/await Exception Propagation” पाठ निःशुल्क है?
हाँ — Kotlin Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “async/await Exception Propagation” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“async/await Exception Propagation” में मैं क्या सीखूँगा?
समझें कि async से exceptions कैसे propagate होती हैं और try-await का उपयोग कब करना चाहिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Kotlin Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Kotlin Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Kotlin Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“async/await Exception Propagation” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Kotlin Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Kotlin Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- SupervisorJob बनाम Job: Failure Isolation
- CoroutineExceptionHandler: Global Uncaught Handler
- async/await Exception Propagation
- Resilient Coroutine Architectures का Design