본문 바로가기
Scala

util.Try VS Try-Catch

by 스르나 2022. 8. 31.

 

스칼라 언어를 처음 배우기 시작했는데 util.Try를 이용한 Exception처리와 Try-catch를 이용한 처리의 차이점을 정리해둘 필요가 있어 보여서 정리하기로 했다.

 

우선 stackoverflow에서 검색한 결과에 도움이 된 글이 있다.

 

링크: https://stackoverflow.com/questions/50201259/difference-between-try-vs-try-catch

 

Difference between Try vs. Try Catch

I understand there is difference between Try/Success/Failure vs. Try Catch. The official document also has a nice example: import scala.io.StdIn import scala.util.{Try, Success, Failure} def divi...

stackoverflow.com

 

 

위 글의 첫 번쨰 답글을 보면 util.Try는 함수형 프로그래밍에 맞게 Exception을 처리할 수 있게 해주는 것, try-catch는 단순히 예외를 처리하고 끝인점이 가장 큰 차이가 있는 듯하다.(대수학, Monad와 같은 단어도 나오는데 아직은 이부분은 잘 몰라서... 최대한 빠르시일안에 공부해서 이해 할 수 있도록 노력해보자...)

 

즉, util.Try는 예외 발생 후속 동작을 처리하는게 가능하다. 예를들면 예외, 성공이후 map, filter등과같은 stream을 이용해서 처리가 가능하다.

 

한번 예제를 직접 만들어서 util.Try의 후속 동작을 체험해보자.

 

class MyExample {

  private def dangerousFunc(num: Int): Int = {
    if(num > 10) throw new IllegalArgumentException("number over ten!")
    else num * 2
  }

  def testUtilTry(num: Int): Try[Int] = Try(dangerousFunc(num))


  def testTryCatch(num: Int): Int = {
    var result = 0
    try{
      result = dangerousFunc(num)
    }catch {
      case e: IllegalArgumentException => {
        println(s"${e.getMessage}")
        result = 0
      }
    }

    result
  }

}

 

위 예제를 보면 dangerousFunc 메소드는 숫자가 10 초과면 예외를 던진다.

 

이 dangerousFunc를 호출하는 testUtilTry, testTryCatch는 각각 uit.Try, try-catch를 이용해서 처리를 했다.

 

testTryCatch같은 경우 메소드 내부에서 예외를 잡아서 응답값(Int형 변수)을 반환하고, testUtilTry는 예외를 직접 처리하지 않고, Try[Int]형 반환값을 준다.

 

이 testUtilTry, testTryCatch를 호출하고나서 후속 처리를 위해 '.'을 찍어보면 IDE가 예시를 보여주는 것이 다르다.

 

utilTry:

util.Try

 

try-catch:

try-catch

 

util.Try같은경우 Option을 사용한 것과 같이 같의 존재, 성공, 실패에 따라 처리하는 stream을 추천해주고,

 

try-catch같은 경우 Int에서 호출할 수 있는 것들을 추천해준다.

 

 

결론

결론적으로 util.Try는 함수형 프로그래밍의 예외처리를 위해 만든어진 Exception처리 구문이다.

 

그렇다고 trt-catch를 아예 사용하지 않는 것은 아닌 것 같다. 메소드 내부에서 직접 처리, 예를 들면 DB query를 호출하고 실패한 경우 롤백, 데이터를 조립 혹은 분해하고 결과를 돌려주는 과정에서 발생한 Exception을 잡고, 임시 데이터를 넣어주는 과정 같은 것들을 처리할 때는 try-catch를 이용할 수 있다.

 

즉, 예외처리 방식 2가지를 util.Try는 함수형 프로그래밍에서 사용, try-catch는 oop에서 사용인 것 처럼 보인다.

애초에 Scala언어가 완전한 함수형, 객체지향형 2가지중 한가지가 아닌 혼합 형이기 때문인 것 같다.

 

그래도 Scala는 함수형의 대표적 언어이기 때문이기에 함수형으로 개발하기 위해 공부해보면 분명 util.Try를 사용하는 경우가 더 많을 것 이기 때문에 자주 사용하면서 익숙해지도록 노력해보자...