What if you could catch errors without messy try-catch blocks everywhere?
Why RunCatching for safe execution in Kotlin? - Purpose & Use Cases
Imagine you have a piece of code that might fail, like reading a file or parsing a number. You try to run it, but if something goes wrong, your whole program crashes or you have to write many lines to catch errors.
Handling errors manually means writing lots of try-catch blocks everywhere. This makes your code long, hard to read, and easy to forget error handling. It's like walking on thin ice, always worried about breaking your program.
RunCatching wraps your risky code in a safe container. It catches errors for you and lets you handle success or failure smoothly. This keeps your code clean and your program safe from crashes.
try { val result = riskyOperation() println("Success: $result") } catch (e: Exception) { println("Failed: ${e.message}") }
val result = runCatching { riskyOperation() }
result.onSuccess { println("Success: $it") }
.onFailure { println("Failed: ${it.message}") }You can write safer, cleaner code that handles errors gracefully without cluttering your logic.
When fetching data from the internet, RunCatching helps you try the request and easily manage failures like no connection or bad responses without crashing your app.
Manual error handling is repetitive and error-prone.
RunCatching simplifies catching exceptions in one place.
It makes your code cleaner and safer to run.
Practice
runCatching in Kotlin?Solution
Step 1: Understand what
runCatchingdoesrunCatchingruns a block of code and catches any exceptions that happen inside it.Step 2: Identify the main purpose
This helps keep the program running smoothly by handling errors safely without crashing.Final Answer:
To execute code and catch exceptions safely without crashing the program -> Option AQuick Check:
runCatching = safe execution [OK]
- Thinking runCatching runs code conditionally
- Confusing runCatching with threading
- Assuming it converts types automatically
runCatching in Kotlin?Solution
Step 1: Recall the syntax of runCatching
runCatchingtakes a lambda block with curly braces to run code safely.Step 2: Match the correct syntax
val result = runCatching { someFunction() } uses curly braces and callssomeFunction()inside, which is correct.Final Answer:
val result = runCatching { someFunction() } -> Option CQuick Check:
runCatching uses braces { } [OK]
- Using parentheses instead of braces
- Trying to call runCatching like a function with arrow
- Accessing runCatching as an object
val result = runCatching { 10 / 0 }
println(result.isSuccess)Solution
Step 1: Analyze the code inside runCatching
The code tries to divide 10 by 0, which causes an exception (ArithmeticException).Step 2: Understand runCatching result
runCatching catches the exception, so no crash happens. TheisSuccessproperty will be false because the block failed.Final Answer:
false -> Option DQuick Check:
Exception caught means isSuccess = false [OK]
- Expecting true because code runs
- Thinking exception is thrown outside runCatching
- Confusing isSuccess with isFailure
runCatching:val result = runCatching {
val number = "abc".toInt()
}
println(result.getOrNull())Solution
Step 1: Understand the code inside runCatching
Trying to convert "abc" to Int causes NumberFormatException, but runCatching catches it.Step 2: Check what getOrNull() returns
Since exception happened,getOrNull()returns null safely without crashing.Final Answer:
No error, prints null because conversion fails -> Option AQuick Check:
Exception caught means getOrNull() = null [OK]
- Expecting exception to crash program
- Thinking getOrNull returns original string
- Assuming syntax error in code block
runCatching and collect only the successful results. Which Kotlin code snippet correctly does this?Solution
Step 1: Understand the goal
We want to convert strings to integers safely, ignoring failures, and collect only successful integers.Step 2: Analyze each option
val numbers = list.map { runCatching { it.toInt() }.getOrNull() }.filterNotNull() uses runCatching to catch exceptions, thengetOrNull()returns integer or null, andfilterNotNull()removes nulls, collecting only successful parses.Final Answer:
val numbers = list.map { runCatching { it.toInt() }.getOrNull() }.filterNotNull() -> Option BQuick Check:
Safe parse + filter null = val numbers = list.map { runCatching { it.toInt() }.getOrNull() }.filterNotNull() [OK]
- Using getOrThrow() which throws on failure
- Filtering nulls before catching exceptions
- Using exceptionOrNull() which returns exceptions, not values
Ready to prove it?
Pass the test and this pattern moves unknown
