Kotlin Exception Handling
Estimated reading: 3 minutes 40 views

❗ Kotlin – Custom Exceptions: Define Your Own Error Types

🧲 Introduction – Why Learn Kotlin Custom Exceptions?

While Kotlin provides standard exceptions like IllegalArgumentException, sometimes you need to represent domain-specific error scenarios. That’s where custom exceptions come in—they help you create semantic, reusable, and testable error-handling logic tailored to your app’s needs.

🎯 In this guide, you’ll learn:

  • How to create and use custom exceptions
  • When to prefer a custom exception over built-in ones
  • How to inherit from the right base class (Exception, RuntimeException)
  • Best practices and real-world use cases

🔧 Defining a Simple Custom Exception

class InvalidUserInputException(message: String) : Exception(message)

✔️ This class inherits from Kotlin’s standard Exception class and can carry a custom message.


🧪 Throwing Your Custom Exception

fun validateUsername(username: String) {
    if (username.isBlank()) {
        throw InvalidUserInputException("Username must not be blank")
    }
}

🔹 Usage:

try {
    validateUsername("  ")
} catch (e: InvalidUserInputException) {
    println("Caught: ${e.message}")
}

🟢 Output:

Caught: Username must not be blank

🧱 Custom Exception with Additional Fields

You can add more context to your exception:

class ApiException(val errorCode: Int, message: String) : Exception(message)

🔹 Usage:

throw ApiException(404, "Resource not found")

✔️ Helps carry structured data through exceptions.


🧬 Runtime vs Checked Exceptions in Kotlin

Kotlin doesn’t enforce checked exceptions. You can choose:

  • Exception (checked in Java) → For recoverable errors
  • RuntimeException → For programming errors (like NullPointerException)
class DatabaseException(message: String) : RuntimeException(message)

✔️ Use RuntimeException when it’s the developer’s fault, and Exception for external/environmental issues.


🧩 Inheritance Hierarchy

Custom exceptions can inherit from each other to create a structured exception system:

open class AppException(message: String) : Exception(message)

class AuthException(message: String) : AppException(message)
class NetworkException(message: String) : AppException(message)

✔️ Use parent classes to catch broad errors, and child classes for specific handling.


⚠️ Catching Multiple Custom Exceptions

try {
    throw AuthException("Unauthorized")
} catch (e: AuthException) {
    println("Auth error: ${e.message}")
} catch (e: AppException) {
    println("General app error")
}

🚫 Common Mistakes

❌ Mistake✅ Fix
Extending Throwable directlyExtend from Exception or RuntimeException instead
Not adding meaningful error messagesAlways include a message for better debugging
Swallowing custom exceptions silentlyLog or rethrow them with context
Using generic exceptions everywhereDefine custom types for clear and semantic code

✅ Best Practices for Kotlin Custom Exceptions

PracticeBenefit
Extend Exception or RuntimeExceptionAligns with platform expectations
Use specific names and messagesMakes debugging and logging easier
Organize in a base exception hierarchyEnables flexible exception catching strategies
Use for domain-level errorsImproves clarity in service/business layer logic

📌 Summary – Recap & Next Steps

Custom exceptions let you define tailored error types that improve code clarity, debuggability, and modularity. Kotlin makes it easy to define and use them, even without checked exceptions.

🔍 Key Takeaways:

  • Create a custom exception using class MyException : Exception(...)
  • Use RuntimeException for programming logic errors, Exception for external errors
  • Add fields or base classes for structured error handling
  • Combine with throw, try-catch, and @Throws as needed

⚙️ Practical Use:
Custom exceptions are ideal for API failure handling, form validation, business rule violations, and error modeling in layered architecture.


❓ FAQs – Kotlin Custom Exceptions

How do I define a custom exception in Kotlin?
✅ Inherit from Exception or RuntimeException:

class MyException(message: String) : Exception(message)

Should I use Exception or RuntimeException?
✅ Use RuntimeException for logic bugs (nulls, illegal states). Use Exception for environmental or recoverable issues.


Can I pass extra data in a custom exception?
✅ Yes. Add properties to your class:

class ApiError(val code: Int, message: String) : Exception(message)

Can I catch custom exceptions using their parent class?
✅ Yes. You can create an exception hierarchy and catch using the base type.


Do custom exceptions work with Java code?
✅ Yes. If you’re exposing them to Java, annotate with @Throws(ExceptionType::class) if needed.


Share Now :

Leave a Reply

Your email address will not be published. Required fields are marked *

Share

Kotlin – Custom Exceptions

Or Copy Link

CONTENTS
Scroll to Top