परिचय
Kotlin में सभी एक्सेप्शन `Throwable` क्लास से विरासत में मिले हैं। कस्टम एक्सेप्शन अनचेक्ड एक्सेप्शन होते हैं (रनटाइम पर फेंके जाते हैं)। यह लेख कस्टम एक्सेप्शन बनाने और उपयोग करने का तरीका दिखाता है।
चेक्ड बनाम अनचेक्ड एक्सेप्शन
| प्रकार | विवरण | उदाहरण |
|---|---|---|
| चेक्ड | कंपाइल टाइम पर चेक किए जाते हैं | IOException, FileNotFoundException |
| अनचेक्ड | रनटाइम पर फेंके जाते हैं | ArithmeticException, NumberFormatException, कस्टम एक्सेप्शन |
उदाहरण 1: चेक्ड एक्सेप्शन (IOException)
import java.io.File
import java.io.InputStream
fun main() {
try {
val inputStream: InputStream = File("nonexistent.txt").inputStream()
} catch (e: Exception) {
e.printStackTrace()
}
}
उदाहरण 2: अनचेक्ड एक्सेप्शन (NumberFormatException)
fun main() {
try {
val str = "Tutorialspoint.com"
val number = str.toInt() // NumberFormatException फेंकेगा
} catch (e: Exception) {
e.printStackTrace()
} finally {
println("एक्सेप्शन हैंडलिंग पूर्ण")
}
}
कस्टम एक्सेप्शन बनाना
कस्टम एक्सेप्शन क्लास `Exception` (या उपवर्ग) से विस्तारित होती है।
बुनियादी कस्टम एक्सेप्शन:
// कस्टम एक्सेप्शन क्लास
class MyCustomException(message: String) : Exception(message)
// अतिरिक्त डेटा के साथ
class ValidationException(
message: String,
val fieldName: String,
val invalidValue: Any
) : Exception(message) {
override fun toString(): String = "$message (फील्ड: $fieldName, मान: $invalidValue)"
}
// एकाधिक कंस्ट्रक्टर
class AppException(
message: String,
cause: Throwable? = null,
val errorCode: Int = 500
) : Exception(message, cause)
कस्टम एक्सेप्शन थ्रो करना और पकड़ना
fun validateAge(age: Int) {
if (age < 0) {
throw MyCustomException("आयु ऋणात्मक नहीं हो सकती: $age")
}
if (age > 150) {
throw ValidationException("आयु अवास्तविक है", "age", age)
}
println("मान्य आयु: $age")
}
fun processUserInput(input: String) {
try {
val age = input.toInt()
validateAge(age)
} catch (e: ValidationException) {
println("मान्यकरण त्रुटि: ${e.message}")
println("फील्ड: ${e.fieldName}, मान: ${e.invalidValue}")
} catch (e: NumberFormatException) {
println("अमान्य संख्या प्रारूप: $input")
} catch (e: MyCustomException) {
println("कस्टम त्रुटि: ${e.message}")
} catch (e: Exception) {
println("अन्य त्रुटि: ${e.message}")
}
}
fun main() {
processUserInput("25") // मान्य
processUserInput("-5") // कस्टम एक्सेप्शन
processUserInput("200") // ValidationException
processUserInput("abc") // NumberFormatException
}
आउटपुट
मान्य आयु: 25 कस्टम त्रुटि: आयु ऋणात्मक नहीं हो सकती: -5 मान्यकरण त्रुटि: आयु अवास्तविक है (फील्ड: age, मान: 200) अमान्य संख्या प्रारूप: abc
उन्नत: सील्ड क्लासेस के साथ एक्सेप्शन हायरार्की (Kotlin 1.5+)
sealed class AppError(val message: String) : Exception(message) {
data class NetworkError(override val message: String, val statusCode: Int) : AppError(message)
data class ValidationError(override val message: String, val errors: Map) : AppError(message)
data class AuthError(override val message: String) : AppError(message)
object UnknownError : AppError("अज्ञात त्रुटि")
}
fun handleError(error: AppError) = when (error) {
is AppError.NetworkError -> println("नेटवर्क त्रुटि: ${error.statusCode}")
is AppError.ValidationError -> println("मान्यकरण: ${error.errors}")
is AppError.AuthError -> println("प्रमाणीकरण त्रुटि")
AppError.UnknownError -> println("अज्ञात")
}
fun main() {
handleError(AppError.NetworkError("टाइमआउट", 408))
handleError(AppError.ValidationError("अमान्य", mapOf("email" to "अमान्य प्रारूप")))
}
सर्वोत्तम अभ्यास
- कस्टम एक्सेप्शन के लिए सार्थक नाम दें (`UserNotFoundException` नहीं `MyException`)
- डेटा क्लास का उपयोग करें जब एक्सेप्शन में संरचित डेटा हो
- कारण (`cause`) पैरामीटर शामिल करें चेनिंग के लिए
- सील्ड क्लासेस का उपयोग करें एक्सेप्शन हायरार्की के लिए (थकाऊ when कवरेज)
- कंट्रोल फ्लो के लिए एक्सेप्शन का उपयोग न करें - केवल असाधारण स्थितियों के लिए