728x90
Use
public class Java_TryWithResources {
public static void main(String[] args) {
try (FileWriter writer = new FileWriter("test.txt")) {
writer.write("Hello Java");
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
- 자바 7 이상부터는 try-with-resources 구문을 사용하면, 자동으로 리소스를 close 처리해준다.
- try에 전달할 수 있는 자원은 AutoCloseable 인터페이스의 구현체로 한정
- Closable or AutoClosable 인터페이스 구현체에 대해서만, close메서드를 호출
Kotlin
fun main() {
FileWriter("test.txt")
.use {
//use 내부적으로 finally 안에 close가 호출되도록 되어있다.
it.write("Hello Kotlin")
}
}
- kotlin에서는 use라는 확장 함수를 통해, try-catch-resources를 대체한다.
runCatching
코틀린은 try-catch를 통한 예외처리 외에도, 함수형 스타일의 Result 패턴을 구현한, runCatching을 제공한다(Result패턴 = 함수가 성공하면 캡슐화된 결과를 반환하거나, 예외가 발생하면 지정한 작업을 수행하는 패턴)
fun getStr(): Nothing = throw Exception("예외 발생 기본 값으로 초기화")
fun main() {
/*
val result = try {
getStr()//항상 예외 발생
} catch (e: Exception) {
println(e.message)
"기본값"
}
println(result)
*/
//runCatching을 사용하면, try-catch문을 더욱 우아하게 작성할 수 있다.
/*
val result = runCatching { getStr() }
.getOrElse {
println(it.message)
"기본값"
}
*/
/*
val result = runCatching { getStr() }
//.getOrNull() //성공 = 값, 실패(예외) = null 반환
//.exceptionOrNull() //성골 = null, 실패 = 예외 반환
//.getOrDefault("기본 값") //성공 = 값, 실패 = 디폴트값 반환
.getOrElse { //성공 = 값, 실패시, it로 예외를 받아 함수의 결과를 반환한다.
println(it.message)
"기본 값"
}
*/
/*
val result = runCatching { "안녕" }
//.getOrThrow() //성공 = 값, 실패 = 예외
.map { //Success로 감싸진 값에 새로운 값을 넣을 수가 있다
"${it}하세요"
}.getOrThrow()
*/
val result = runCatching { "안녕" }
/*
.map {
throw Exception("예외")
}.getOrDefault("기본값") //map 안에서 발생한 예외는 getOrDefault 로 복구하려구 해도 안된다.
*/
/*
.mapCatching {
throw Exception("예외")
}.getOrDefault("기본 값")
*/
/*
.recover { "복구" } //성공시에 동작하지 않고, 실패할 경우 recover가 동작한다.
.getOrNull()
*/
.recoverCatching {
throw Exception("예와")
}.getOrDefault("기본 값")
/*
result?.let {
println(it.message)
throw it
*/
println(result)
}
- runCatching 내부에서는 Result 내부 동반 객체에서, 성공 상태/실패 상태에 따라 Result를 생성하고 있다.
- Result를 사용해서 여러가지 기능을 사용할 수 있다.
- getOrNull : 실패인 경우 null 반환
- execeptionOrNull : 성공인 경우 null 반환 / 실패인 경우 Throwable을 반환
- getOrDefault : 성공인 경우 성공 값 반환 / 실패인 경우 지정한 기본 값을 반환
- getOrElse : 실패인 경우, 수신자 객체로 Throwable을 전달받고, let, run과 같이 함수의 결과를 반환
- getOrThrow : 성공인 경우 성공 값을 반환 / 실패인 경우 예외를 발생
- map : 성공인 경우 원하는 값으로 변경
- mapCatching : map 내에서 예외가 발생할 경우 재처리 가능
- recover : 실패할 경우 원하는 값으로 변경
- recoverCatching : recover 내에서 예외가 발생할 경우 재처리 가능
728x90
'실무 프로젝트로 배우는 Kotlin & Spring > 코틀린 고급' 카테고리의 다른 글
| 람다로 프로그래밍하기 (0) | 2022.10.22 |
|---|---|
| 스코프 함수 (0) | 2022.10.22 |
| 페어와 구조분해할당 (0) | 2022.10.16 |
| 지연 초기화 (0) | 2022.10.16 |
| 제네릭 (0) | 2022.10.16 |