복붙노트

[SCALA] 스칼라와 기능 시도 및 캐치

SCALA

스칼라와 기능 시도 및 캐치

스칼라 리소스를 개방하고,이 메소드 그것보다 방법을 적용하는 더욱 관용적 방법이 (자바에서 직접 번역) :

var is: FileInputStream = null
try {
  is = new FileInputStream(in)
  func(is)
} catch {
  case e: IOException =>
    println("Error: could not open file.")
    println("       -> " + e)
    exit(1)
} finally {
  if(is) is.close()
}

해결법

  1. ==============================

    1.대출 패턴은 GitHub의에 조쉬 Suereth의 스칼라 - ARM 라이브러리에서 다양한 방식으로 구현된다.

    대출 패턴은 GitHub의에 조쉬 Suereth의 스칼라 - ARM 라이브러리에서 다양한 방식으로 구현된다.

    당신은 다음과 같은 리소스를 사용할 수 있습니다 :

    val result = managed(new FileInputStream(in)).map(func(_)).opt 
    

    어떤 옵션에 싸여 FUNC의 결과를 반환하고 입력 스트림을 닫는 돌볼 것입니다.

    리소스를 만들 때, 당신은 scala.util.control.Exception 개체와 결합 할 수있는 가능한 예외를 처리하려면 :

    import resource._
    import util.control.Exception.allCatch
    
    allCatch either { 
      managed(new FileInputStream(in)).map(func(_)).opt 
    } match {
      case Left(exception) => println(exception)
      case Right(Some(result)) => println(result)
      case _ =>
    }
    
  2. ==============================

    2.새 위치로 대출 패턴 (죽은 링크) 비 영구적 인 링크를 사용합니다.

    새 위치로 대출 패턴 (죽은 링크) 비 영구적 인 링크를 사용합니다.

  3. ==============================

    3.즉, 기능 갈 바람직하지 않다 한 경우 일 수 있습니다. allready 언급 대출 패턴 오류 처리의 imparative 버전의 캡슐화하지만, 그 기능을 프로그래밍 할 수 없다, 또한 오류 처리의 돌봐 doenst.

    즉, 기능 갈 바람직하지 않다 한 경우 일 수 있습니다. allready 언급 대출 패턴 오류 처리의 imparative 버전의 캡슐화하지만, 그 기능을 프로그래밍 할 수 없다, 또한 오류 처리의 돌봐 doenst.

    당신이 정말로 원하는 경우이 기능 오류 처리 모나드와 함께 할 수 있습니다. 스칼라 너무 잘 "하드 코어"기능 연습 이런 종류의 지원되지 않는 이유를 들어 내가 제공하는 링크는이에 하스켈 특정 문서입니다.

    난 당신이 치료 오류를 원한다면 당신은 또한 다른 상황 또는 당신이 중 하나를 쓰기 특별한 기능을 가지고 오류 처리와 대출 패턴하지만 수단을 확장 할 수 ... 명령형 방법 및 사용 시도 캐치 마지막으로 가고 당신에게 권하고 것 (당신은 allready 코드에서 catch 블록 내부에 가지고있는 것보다 아무것도가없는) 오류 처리에 대한 부분적인 기능을 통해 통과해야합니다.

  4. ==============================

    4.스칼라 2.13부터, 표준 라이브러리는 전용 자원 관리 유틸리티를 제공합니다 : 사용.

    스칼라 2.13부터, 표준 라이브러리는 전용 자원 관리 유틸리티를 제공합니다 : 사용.

    그것은 나중에 입력 파일과, 상관없이, 가까운 파일 자원으로 재생하려면 AutoCloseable을 구현 그것은이 FileInputStream에이 경우에 사용할 수 있습니다 :

    import scala.util.{Using, Failure}
    import java.io.FileInputStream
    
    Using(new FileInputStream(in)) {
      is => func(is)
    }.recoverWith {
      case e: java.io.IOException =>
        println("Error: could not open file.")
        Failure(e)
    }
    

    사용 중 하나를 조작 또는 오류의 결과를 제공하는 시도를 생산하기 때문에, 우리는 시도 번호의 recoverWith를 통해 예외로 작업 할 수 있습니다.

  5. from https://stackoverflow.com/questions/5149009/functional-try-catch-with-scala by cc-by-sa and MIT license