Exception classes
Kotlin의 모든 예외 클래스는 Throwable 클래스를 상속한다. 모든 예외에는 메시지, 스택 추적 및 선택적 원인이 있다.
예외 객체를 throw하려면 throw 표현식을 사용한다.
fun main() {
throw Exception("Hi There!")
}
예외를 잡으려면 try... catch 표현식을 사용하시오.
try {
// some code
} catch (e: SomeException) {
// handler
} finally {
// optional finally block
}
0개 이상의 catch 블록이 있을 수 있으며 finally 블록은 생략될 수 있다. 그러나 적어도 하나의 catch 또는 finally 블록이 필요하다.
Try is an expression
try는 반환 값을 가질 수 있음을 의미하는 표현식이다.
val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }
try 표현식의 반환 값은 try 블록의 마지막 표현식이거나 catch 블록의 마지막 표현식이다. finally 블록의 내용은 표현식의 결과에 영향을 주지 않는다.
Checked exceptions
Kotlin에는 확인된 예외가 없다. 여기에는 여러 가지 이유가 있지만 왜 그런지 설명하는 간단한 예를 제공한다.
다음은 StringBuilder 클레스에 구현된 JDK의 예제 인터페이스이다.
Appendable append(CharSequence csq) throws IOException;
이 용법은 문자열을 무언가(StringBuilder, 일종의 로그, 콘솔 등)에 추가할 때마다 IOException을 잡아야 한다고 말한다. 왜 그런가? 구현이 IO 작업을 수행할 수 있기 때문이다(Writer는 Appendable도 구현함). 결과는 다음과 같은 코드이다.:
try {
log.append(message)
} catch (IOException e) {
// Must be safe
}
그리고 그것은 좋지 않다. Effective Java, 3rd Edition, 항목 77: 예외를 무시하지 마시오.
Bruce Eckel은 확인된 예외에 대해 다음과 같이 말한다.
소규모 프로그램을 조사하면 예외 사양을 요구하는 것이 개발자 생산성을 향상시키고 코드 품질을 향상시킬 수 있다는 결론으로 이어진다. 그러나 대규모 소프트웨어 프로젝트의 경험은 다른 결과를 나타낸다. 생산성은 떨어지고 코드 품질은 거의 또는 전혀 증가하지 않는다.
다음은 이 문제에 대한 몇 가지 추가 생각이다.
- Java's checked exceptions were a mistake(Rod Waldhoff)
- The Trouble with Checked Exceptions(Anders Hejlsberg)
Java, Swift 또는 Objective-C에서 Kotlin 코드를 호출할 때 가능한 예외에 대해 호출자에게 알리려면 @Throws 어노테이션을 사용할 수 있다.
The Nothing type
throw는 Kotlin의 표현식이므로 예를 들어 Elvis 표현식의 일부로 사용할 수 있다.
val s = person.name ?: throw IllegalArgumentException("Name required")
throw 표현식의 타입은 Nothing 이다. 이 타입에는 값이 없으며 도달할 수 없는 코드 위치를 표시하는 데 사용된다. 자신의 코드에서 Nothing을 사용하여 반환하지 않는 함수를 표시할 수 있다.
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}
이 함수를 호출하면 컴파일러는 호출 이후에 실행이 계속되지 않는다는 것을 알게 된다.
val s = person.name ?: fail("Name required")
println(s)
타입 유추를 처리할 때도 이 타입이 발생할 수 있다. 이 유형의 nullable 변형인 Nothing?에는 null인 정확히 하나의 가능한 값이 있다. null을 사용하여 유추된 타입의 값을 초기화하고 더 구체적인 타입을 결정하는 데 사용할 수 있는 다른 정보가 없는 경우 컴파일러는 Nothing? 타입을 유추한다.
val x = null // 'x' has type `Nothing?`
val l = listOf(null) // 'l' has type `List<Nothing?>
원문
Exceptions | Kotlin
kotlinlang.org
'프로그래밍 > Android' 카테고리의 다른 글
[Kotlin] Returns and jumps (0) | 2021.09.05 |
---|---|
[Kotlin] Conditions and loops (조건문 및 반복문) (0) | 2021.09.05 |
[Kotlin] Type checks and casts(타입 확인 및 형변환) (0) | 2021.08.31 |
[Kotlin] Basic types (기본 타입) (0) | 2021.08.29 |
[Kotlin] Coding conventions (0) | 2021.08.26 |