<br>
- 정확히는 `Closeable` 또는 상위 개념인 `Autoloseable` 인터페이스의 구현체에 대해서 자동으로 close 메서드를 호출한다.
- `Closeable` 인터페이스 구현하는 Writer
``` java
public abstract class Writer implements Appendable, Closeable
Writer를 상속 받은 PrintWriter는 close 메서드를 재정의하고 있다.
public class PrintWriter extends Writer {
...
public void close() {
try {
synchronized (lock) {
if (out == null)
return;
out.close();
out = null;
}
}
catch (IOException x) {
trouble = true;
}
}
}
코틀린은 try-catch-resource 구문을 제공하지 않지만, use라는 확장 함수를 제공한다.
코틀린은 try-catch를 통한 예외처리 외에도 함수형 스타일의 Result 패턴을 구현한 runCatching을 제공한다.
Result 패턴이란 함수가 성공하면 캡슐화된 결과를 반환하거나 예외가 발생하면 지정한 작업을 수행하는 패턴이다.
try-catch 사용
fun getStr(): Nothing = throw Exception("예외 발생 기본 값으로 초기화")
fun main () {
val result = try {
getStr()
} catch (e: Exception) {
println(e.message)
"기본값"
}
println(result)
}
// 예외 발생 기본 값으로 초기화
// 기본값
runCatching 사용
val result2 = runCatching { getStr() }
.getOrElse {
println(it.message)
"기본값"
}
println(result2)
// 예외 발생 기본 값으로 초기화
// 기본값
Result 내부 동반 객체에서 성공 상태와 실패 상태에 따라 Result를 생성하고 있음
public companion object {
public inline fun <T> success(value: T): Result<T> = Result(value)
public inline fun <T> failure(exception: Throwable): Result<T> = Result(createFailure(exception))
}
Result의 선언부
isSuccess는 성공적인 결과를 나타내는 경우 true 반환
isFailure는 실패한 결과를 나타내는 경우 true 반환
public value class Result<out T> internal constructor (
internal val value: Any?
): Serializable {
public val isSuccess: Boolean get() = value !is Failure
public val isFailure: Boolean get() = value is Failure
...
}
고급 예외처리
use를 사용한 리소스 해제
try-with-resource
구문을 사용하면 자동으로 리소스를 close 처리해준다.public class Java_TryWithResources {
}
try-catch-resource
구문을 제공하지 않지만,use
라는 확장 함수를 제공한다.runCatching을 사용해 우아하게 예외처리하기
Result 패턴
을 구현한runCatching
을 제공한다.Result 패턴
이란 함수가 성공하면 캡슐화된 결과를 반환하거나 예외가 발생하면 지정한 작업을 수행하는 패턴이다.isSuccess
는 성공적인 결과를 나타내는 경우 true 반환isFailure
는 실패한 결과를 나타내는 경우 true 반환Result의 다양한 기능들
getOrNull
: 실패인 경우 null을 반환exceptionOrNull
: 성공인 경우 null을 반환하고 실패인 경우 Throwable을 반환getOrDefault
: 성공 시엔 성공 값을 반환하고 실패 시엔 지정한 기본 값을 반환getOrElse
: 실패 시 수신자 객체로 Throwable을 전달 받고, let, run과 같이 함수의 결과를 반환한다.getOrThrow
: 성공 시에는 값을 반환, 실패 시에는 예외를 발생시킨다.map
: 성공인 경우 원하는 값으로 변경할 수 있다.mapCatching
: map처럼 성공인 경우 원하는 값으로 변경할 수 있다. 예외가 발생하면 재처리가 가능하다.map
에서 예외가 발생한 경우mapCatching
에서 예외가 발생한 경우recover
: map은 성공 시에 원하는 값으로 변경하지만, recover는 실패 시에 원하는 값으로 변경할 수 있다.recoverCatching
: recoverCatching 내에서 예외가 발생할 경우 재처리 가능