๐ก Kotlin์์ ์ฌ์ฉ๋๋ ์์ธ ํด๋์ค์ ์ปค์คํ ์์ธ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ ์๋์ง ํ์ตํ์์ต๋๋ค.
Kotlin & Java์ Exception Class
- Kotlin์์ ์์ธ ์ฒ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Java์ ์์ธ ์ฒ๋ฆฌ ๋ชจ๋ธ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
- Throwable ํด๋์ค๋ ๋ชจ๋ ์์ธ ํด๋์ค์ ์ต์์ ํด๋์ค์ด๋ฉฐ, ๋ชจ๋ ์์ธ์ ์ค๋ฅ์ ๊ธฐ๋ณธ ํด๋์ค ์ ๋๋ค.
Throwable ํด๋์ค
- Java์ Kotlin์์ ๋ฐ์ํ๋ ๋ชจ๋ ์์ธ๋ Throwable ํด๋์ค์ ์ธ์คํด์ค์ด๋ฉฐ, ์๋์ ๊ฐ์ ๋ฉ์๋๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
- getMessage() : ์์ธ ๋๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐํ
- getCause() : ์์ธ ์์ธ์ ๋ถ์
- printStackTrace() : ์คํ ํธ๋ ์ด์ค๋ฅผ ์ฝ์์ ์ถ๋ ฅ
Exception ํด๋์ค
- ํ๋ก๊ทธ๋จ์ ๋ ผ๋ฆฌ์ ์ธ ์ค๋ฅ๋ฅผ ๋ํ๋ ๋๋ค.
- ๋๋ถ๋ถ์ ์์ธ๋ Exception ํด๋์ค์ ํ์ ์ ํ์ด๋ฉฐ, 2๊ฐ์ง ์ ํ์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
- Checked Exception : ์ปดํ์ผ ํ์์ ์์ธ ์ฒ๋ฆฌ๊ฐ ์๊ตฌ๋๋ ์์ธ์
๋๋ค.
- ex> IOException, SQLException..
- UnChecked Exception :๋ฐํ์์์ ๋ฐ์ํ๋ ์์ธ๋ก, ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ์ง ์์ต๋๋ค.
- ex> NullPointerException, ArrayIndexOutOfBoundsException..
- Checked Exception : ์ปดํ์ผ ํ์์ ์์ธ ์ฒ๋ฆฌ๊ฐ ์๊ตฌ๋๋ ์์ธ์
๋๋ค.
Error ํด๋์ค
- ํ๋ก๊ทธ๋จ์์ ๋ณต๊ตฌํ ์ ์๋ ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ๋ํ๋ ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ค์ด ์ค๋ฅ์
๋๋ค.
- ex> OutOfMemoryError, StackOverflowError..
Kotlin์์๋?
- Kotlin์์๋ Checked Exception์ ๊ฐ์ ํ์ง ์์ต๋๋ค.
- ์๋ฐ์์๋ Checked Exception์ด ๋ฐ์ํ ์ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ฐ๋์ try-catch ๋ธ๋ก์ผ๋ก ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋, throws ํค์๋๋ฅผ ์ฌ์ฉํด ๋ฉ์๋ ์ ์ธ์ ๋ช ์ํด์ผ ํฉ๋๋ค.
- ํ์ง๋ง Kotlin์ ์ด๋ฌํ ๊ฐ์ ์ฌํญ์ด ์์ผ๋ฉฐ, ๋ชจ๋ ์์ธ๊ฐ UnChecked Exception์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ด๋ฌํ ์ค๊ณ์ ์ด์ ๋?
- Kotlin์์ ์ด๋ฌํ ์ค๊ณ๋ ์๋์ ๊ฐ์ ํฐ ์ฅ์ ์ ์ป์ ์ ์์ต๋๋ค.
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ๊ณผ์ ์กฐํ
- ๊ฐ๊ฒฐํ ์ฝ๋ ์์ฑ
- ๋ถํ์ํ ์์ธ ์ฒ๋ฆฌ ๊ฐ์
- Kotlin์ ์ค๊ณ ์ฒ ํ ์ค ํ๋๋ก, ๊ฐ๋ฐ์์๊ฒ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
Kotlin์ ์์ธ์ฒ๋ฆฌ
try-catch block
- ์์ธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
try {
val result = riskyOperation()
println("Result : $result")
} catch (e: Exception) {
println("error : ${e.message}")
} finally {
println("end block")
}
fun riskyOperation(): Int {
throw Exception("wrong")
}
runCatching
- ๊ฐ๊ฒฐํ๊ฒ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ํจ์ํ ์คํ์ผ์ ์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋๋ค.
- <Result> ํ์ ์ ๋ฐํํ์ฌ ์ฑ๊ณต๊ณผ ์คํจ๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
val result = runCatching {
// ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฝ๋
riskyOperation()
}.onSuccess {
// ์ฑ๊ณต์ ์ผ๋ก ์คํ๋ ๊ฒฝ์ฐ
println("Result: $it")
}.onFailure {
// ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ
println("An error occurred: ${it.message}")
}
result.getOrNull()?.let {
println("Success: $it")
} ?: run {
println("Failure")
}
fun riskyOperation(): Int {
throw Exception("wrong")
}
try-catch์ runCatching์ ์ฐจ์ด์
- ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์กด์ฌํ๋ฉฐ, ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ช ์์ ์์ธ ์ฒ๋ฆฌ vs ํจ์ํ ์คํ์ผ
- try-catch๋ ์ ํต์ ์ธ ๋ช ์์ ์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ผ๋ก, ์ฝ๋ ํ๋ฆ ๋ด์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- runCatching์ ํจ์ํ ์คํ์ผ๋ก ์์ธ๋ฅผ Result ๊ฐ์ฒด๋ก ๊ฐ์ธ์ ์ฒ๋ฆฌํฉ๋๋ค.
์ฝ๋ ๊ฐ๋ ์ฑ
- try-catch๋ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ๋ ๋ช ํํ๊ฒ ๋๋ฌ๋ฉ๋๋ค.
- runCatching์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง์ง๋ง, ์ต์ํ์ง ์์ ๊ฐ๋ฐ์์๊ฒ๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
์ฒด์ด๋ ๊ธฐ๋ฅ๊ณผ Result ํ์
- runCatching์ onSuccess, onFailure ๋ฑ์ ๋ฉ์๋ ์ฒด์ด๋์ด ๊ฐ๋ฅํ๋ฉฐ, ํ์ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค.
- ๋ํ Result ํ์ ์ ๋ฐํํ์ฌ ์ฑ๊ณต๊ณผ ์คํจ๋ฅผ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
- ๋ฐ๋ฉด์ try-catch๋ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ๋ธ๋ก ๋ด์์๋ง ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.