[Kotlin] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

๐Ÿ’ก 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..

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๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ๋ธ”๋ก ๋‚ด์—์„œ๋งŒ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

https://velog.io/@ekxk1234/์ฝ”ํ‹€๋ฆฐ-์˜ˆ์™ธ์ฒ˜๋ฆฌ