Kotlin में त्रुटि प्रबंधन: try/catch और उन्नत तकनीकें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Kotlin में उन्नत त्रुटि प्रबंधन: try/catch से कार्यात्मक दृष्टिकोण तक



त्रुटि प्रबंधन विश्वसनीय सॉफ्टवेयर विकसित करने में प्रमुख कार्यों में से एक है। Kotlin में, क्लासिक try/catch/finally तंत्र के अलावा, उन्नत उपकरणों का एक पूरा शस्त्रागार मौजूद है: Result, runCatching, sealed class और कार्यात्मक मोनाड। इस लेख में, हम समझेंगे कि बुनियादी उपयोग से आगे कैसे बढ़ें और अपने कोड को अधिक सुरक्षित, पठनीय और पूर्वानुमानित कैसे बनाएं।



1. क्लासिक try/catch: यह अभी भी कब उपयुक्त है



Kotlin में बेसिक try/catch एक एक्सप्रेशन है जो मान लौटा सकता है। यह पहली चीज़ है जो इसे Java से अलग करती है।



val result: String = try {    riskyOperation()} catch (e: IOException) {    "इनपुट-आउटपुट त्रुटि: ${e.message}"} catch (e: Exception) {    "अज्ञात त्रुटि: ${e.message}"} finally {    println("finally ब्लॉक हमेशा निष्पादित होता है")}


सरलता के बावजूद, इस दृष्टिकोण में कमियाँ हैं:

  • अपवाद एक महंगा ऑपरेशन है (stack trace बनाना)।
  • त्रुटि का प्रकार टाइप स्तर पर तय नहीं होता - प्रबंधन छूटना आसान है।
  • बड़ी संख्या में नेस्टेड ऑपरेशनों के साथ कोड बोझिल हो जाता है।


try/catch का उपयोग कब करें?

  • बाहरी संसाधनों (फ़ाइलें, नेटवर्क, डेटाबेस) के साथ काम करते समय।
  • लाइब्रेरी कोड में, जहाँ अपवाद अनुबंध का हिस्सा हैं।
  • गंभीर त्रुटियों के लिए जिन्हें स्थानीय रूप से संभालना संभव नहीं है।


2. कार्यात्मक दृष्टिकोण: Result और runCatching



Kotlin एक अंतर्निहित Result क्लास प्रदान करता है, जो उस ऑपरेशन के परिणाम का प्रतिनिधित्व करता है जो सफलता या त्रुटि में समाप्त हो सकता है। यह अपवादों का एक विकल्प है, जिसमें महंगे stack trace की आवश्यकता नहीं होती।



fun divide(a: Int, b: Int): Result<Int> {    return runCatching {        a / b    }}

fun main() { val result = divide(10, 0) result.onSuccess { value -> println("परिणाम: $value") }.onFailure { error -> println("त्रुटि: ${error.message}") }}


Result के तरीके

  • getOrNull() — मान या null लौटाता है।
  • getOrDefault(default) — मान या डिफ़ॉल्ट मान लौटाता है।
  • map और flatMap — परिवर्तनों की श्रृंखला के लिए।
  • recover — त्रुटि के बाद पुनर्प्राप्ति।


val safeResult = runCatching { riskyOperation() }    .map { it.toUpperCase() }    .recover { "default_value" }    .getOrDefault("fallback")


महत्वपूर्ण: Result थ्रेड्स के बीच स्थानांतरण या क्लास फ़ील्ड में भंडारण के लिए अभिप्रेत नहीं है - इसका उपयोग केवल स्थानीय मान के रूप में करें।



3. Sealed क्लास: टाइप स्तर पर त्रुटियों का मॉडलिंग



जब सभी संभावित स्थितियों (सफलता, विभिन्न प्रकार की त्रुटियाँ) को स्पष्ट रूप से परिभाषित करने की आवश्यकता होती है, तो sealed class मदद करते हैं। यह बीजगणितीय डेटा प्रकार बनाने के लिए एक शक्तिशाली उपकरण है।



sealed class NetworkResult<out T> {    data class Success<T>(val data: T) : NetworkResult<T>()    data class Error(val message: String, val code: Int) : NetworkResult<Nothing>()    object Loading : NetworkResult<Nothing>()}

fun fetchUser(id: Int): NetworkResult<User> { return try { val user = api.getUser(id) NetworkResult.Success(user) } catch (e: HttpException) { NetworkResult.Error("सर्वर ने त्रुटि लौटाई", e.code()) } catch (e: Exception) { NetworkResult.Error("अज्ञात त्रुटि", 0) }}

fun handleResult(result: NetworkResult<User>) { when (result) { is NetworkResult.Success -> println("उपयोगकर्ता: ${result.data.name}") is NetworkResult.Er

ब्लॉग

पुस्तक अनुशंसाएँ