Kotlin Academy · पाठ

कस्टम Exception Classes बनाना

अर्थपूर्ण संदेशों और properties के साथ domain-specific exceptions परिभाषित करें।

पाठ 2, कुल 4 में से13 चरण

कस्टम Exception Classes बनाना, CoddyKit पर Kotlin Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Kotlin Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

कस्टम अपवाद क्यों?

कस्टम अपवाद डोमेन का अर्थ व्यक्त करते हैं: कॉल करने वाले उन्हें विशेष रूप से पकड़ सकते हैं, उपयोगी संदेश प्राप्त कर सकते हैं और प्रकार के आधार पर अलग कार्रवाई कर सकते हैं।

सबसे सरल कस्टम अपवाद

Exception या किसी विशिष्ट उपवर्ग, जैसे RuntimeException, का उपवर्ग बनाएँ और सुपर कंस्ट्रक्टर को संदेश पास करें।

class InvalidEmailException(message: String) : Exception(message)
fun main() {
    try {
        throw InvalidEmailException("missing @")
    } catch (e: InvalidEmailException) {
        println("caught: ${e.message}")
    }
}

प्रॉपर्टी वाला अपवाद

संदर्भ बताने के लिए फ़ील्ड जोड़ें: HTTP स्थिति, फ़ील्ड का नाम, पुनः प्रयासों की संख्या आदि।

class HttpError(
    message: String,
    val statusCode: Int
) : Exception(message)
fun main() {
    try {
        throw HttpError("Not Found", 404)
    } catch (e: HttpError) {
        println("HTTP ${e.statusCode}: ${e.message}")
    }
}

कारण वाला अपवाद

श्रृंखला में मूल अपवाद को सुरक्षित रखने के लिए cause पास करें।

class DatabaseError(message: String, cause: Throwable) : Exception(message, cause)
fun main() {
    try {
        try { error("connection refused") }
        catch (e: Throwable) { throw DatabaseError("query failed", e) }
    } catch (e: DatabaseError) {
        println("${e.message} (caused by: ${e.cause?.message})")
    }
}

चेक्ड बनाम अनचेक्ड

Kotlin सभी अपवादों को अनचेक्ड मानता है (throws घोषणा आवश्यक नहीं है)। परंपरा के अनुसार RuntimeException का उपवर्ग बनाएँ।

class ValidationException(field: String, message: String) :
    RuntimeException("[$field] $message")
fun main() {
    try {
        throw ValidationException("age", "must be positive")
    } catch (e: ValidationException) {
        println(e.message)
    }
}

डोमेन अपवादों का पदानुक्रम

ऐसा पदानुक्रम बनाएँ जिससे कॉल करने वाले सामान्य प्रबंधन के लिए आधार प्रकार या विशेष मामलों के लिए विशिष्ट उपप्रकार पकड़ सकें।

open class AppException(message: String) : RuntimeException(message)
class NotFoundException(what: String) : AppException("$what not found")
class UnauthorizedException : AppException("not authorized")
fun main() {
    val errors = listOf(NotFoundException("user"), UnauthorizedException())
    for (e in errors) {
        try { throw e }
        catch (e: AppException) { println("App error: ${e.message}") }
    }
}

सीलबंद अपवाद पदानुक्रम

त्रुटि प्रकारों के बंद समूहों के लिए sealed पदानुक्रम का उपयोग करें — कॉल करने वाले हर वैरिएंट को पूर्ण रूप से संभाल सकते हैं।

sealed class ApiError(message: String) : RuntimeException(message) {
    class Timeout : ApiError("timeout")
    class NotFound(val id: String) : ApiError("not found: $id")
    class ServerError(val status: Int) : ApiError("server returned $status")
}
fun describe(e: ApiError) = when (e) {
    is ApiError.Timeout -> "request timed out"
    is ApiError.NotFound -> "id ${e.id} missing"
    is ApiError.ServerError -> "5xx: ${e.status}"
}
fun main() {
    println(describe(ApiError.NotFound("user-42")))
}

नामकरण परंपरा

स्पष्टता के लिए कस्टम अपवाद क्लास के नामों का अंत Exception या Error से करें। भूतकाल या संज्ञा का उपयोग करें (जैसे NotFound, InvalidInput)।

class InvalidInputException(msg: String) : RuntimeException(msg)
class UserNotFoundException(id: Int) : RuntimeException("user $id not found")
fun main() {
    try { throw UserNotFoundException(7) }
    catch (e: UserNotFoundException) { println(e.message) }
}

अपवादों का दस्तावेज़ीकरण

किसी फ़ंक्शन द्वारा उठाए जा सकने वाले अपवादों का दस्तावेज़ीकरण करने के लिए KDoc @throws का उपयोग करें।

/**
 * @throws InvalidEmailException if the email is malformed
 */
fun validate(email: String) {
    if ("@" !in email) throw InvalidEmailException("missing @")
}
class InvalidEmailException(m: String) : RuntimeException(m)
fun main() {
    try { validate("nope") }
    catch (e: InvalidEmailException) { println(e.message) }
}

अपवादों के अत्यधिक उपयोग से बचें

अपवाद असाधारण स्थितियों के लिए होते हैं। अपेक्षित परिणामों (खाली इनपुट, अनुपस्थित वैकल्पिक फ़ील्ड) के लिए नल-योग्य रिटर्न, सीलबंद परिणाम प्रकार या डिफ़ॉल्ट मान को प्राथमिकता दें।

fun findUser(id: Int): String? = if (id == 1) "Alice" else null
fun main() {
    val name = findUser(42) ?: "(unknown)"
    println(name) // (unknown), no exception
}

व्यावहारिक उदाहरण

स्थिति और बॉडी के साथ काल्पनिक API क्लाइंट के लिए एक वास्तविक-जैसा कस्टम अपवाद।

class ApiException(
    message: String,
    val statusCode: Int,
    val responseBody: String
) : RuntimeException(message)
fun main() {
    try {
        throw ApiException("Bad Request", 400, "{\"error\":\"invalid\"}")
    } catch (e: ApiException) {
        println("[${e.statusCode}] ${e.message}: ${e.responseBody}")
    }
}

त्वरित जाँच

डोमेन-विशिष्ट Kotlin अपवाद परिभाषित करते समय सबसे अधिक उपयोग की जाने वाली पैरेंट क्लास कौन-सी है?

पुनरावलोकन

कस्टम अपवाद डोमेन का अर्थ व्यक्त करते हैं। RuntimeException या Exception का उपवर्ग बनाएँ; संदर्भ के लिए प्रॉपर्टी जोड़ें; मूल कारण सुरक्षित रखें; समूहित कैच के लिए पदानुक्रम बनाएँ। बंद समूहों के लिए सीलबंद अपवादों का उपयोग करें और जब त्रुटियाँ अपेक्षित हों, तब नल-योग्य या परिणाम प्रकारों को प्राथमिकता दें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

अक्सर पूछे जाने वाले प्रश्न

क्या “कस्टम Exception Classes बनाना” पाठ निःशुल्क है?

हाँ — Kotlin Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “कस्टम Exception Classes बनाना” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“कस्टम Exception Classes बनाना” में मैं क्या सीखूँगा?

अर्थपूर्ण संदेशों और properties के साथ domain-specific exceptions परिभाषित करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Kotlin Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Kotlin Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Kotlin Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“कस्टम Exception Classes बनाना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Kotlin Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Kotlin Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Expression के रूप में try/catch/finally
  2. कस्टम Exception Classes बनाना
  3. runCatching और Result
  4. Exceptions को फिर से फेंकना और Exception Chaining
← Kotlin Academy पर वापस जाएँ