복붙노트

[SCALA] 스칼라에서 예외를 던지는 무슨 일이 "공식적인 규칙"입니다

SCALA

스칼라에서 예외를 던지는 무슨 일이 "공식적인 규칙"입니다

나는 코 세라의 스칼라 과정을 다음과 같은거야. 나뿐만 아니라 Odersky의 스칼라 책을 읽기 시작했습니다.

나는 종종 듣고는 제어 흐름을 깨고 우리가 일반적으로 실패 또는 성공을 가진 하나를 반환 있기 때문에, 함수형 언어에서 예외를 던질 수있는 좋은 생각이 아니라고 무엇입니까. 스칼라 2.10가 그 방향으로가는 시도를 제공 할 것으로도 보인다.

그러나 책과 과정에서 마틴 오더 스키는 예외가 나쁜 것을 (적어도 지금은) 말을하지 않는 것, 그는 그들에게 많이 사용합니다. 나는 또한 방법이 필요 / 주장 발견 ...

마지막으로 내가 모범 사례를 따르세요 때문에 조금 혼란 스러워요하지만 그들은 명확하지 않은 언어가 양 방향으로 갈 것 같다 ...

누군가가 나는 경우에 사용해야 걸 설명 할 수 있습니까?

해결법

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

    1.기본 지침은 ** 정말 특별한 뭔가 예외를 사용하는 것입니다. 에 "보통"실패의 경우, 옵션 또는 중 하나를 사용하는 것이 훨씬 낫다. 당신은 누군가가 길을 잘못 재채기를 할 때 예외가 발생되는 경우 자바와 인터페이스하는 경우, 당신은 자신을 안전하게 유지하려고 할 수 있습니다.

    기본 지침은 ** 정말 특별한 뭔가 예외를 사용하는 것입니다. 에 "보통"실패의 경우, 옵션 또는 중 하나를 사용하는 것이 훨씬 낫다. 당신은 누군가가 길을 잘못 재채기를 할 때 예외가 발생되는 경우 자바와 인터페이스하는 경우, 당신은 자신을 안전하게 유지하려고 할 수 있습니다.

    이제 몇 가지 예를 보자.

    당신이지도에서 무언가를 가져 오는 방법이 있다고 가정. 무엇이 잘못 될 수 있을까? 음, 요소처럼 예상 segfault의 * 스택 오버 플로우, 또는 뭔가처럼 극적이고 위험한 뭔가를 찾을 수 없습니다. 당신은 segfault의 스택이 예외를 throw 오버 플로우하자,하지만 당신은 단지 요소를 찾을 수없는 경우, 왜 옵션 [V] 대신 값 또는 예외 (또는 null)을 반환하지 않는 게 좋을?

    이제 사용자가 파일 이름을 입력하도록되어있는 프로그램을 작성하는 가정합니다. 방금 즉시 뭔가 잘못 프로그램에 구제하지 않을거야 지금, 만약 양자 택일 갈 방법입니다 :

    def main(args: Array[String]) {
      val f = {
        if (args.length < 1) Left("No filename given")
        else {
          val file = new File(args(0))
          if (!file.exists) Left("File does not exist: "+args(0))
          else Right(file)
        }
      }
      // ...
    }
    

    이제 공백으로 구분 된 숫자와 함께 문자열을 구문 분석한다고 가정합니다.

    val numbers = "1 2 3 fish 5 6"      // Uh-oh
    // numbers.split(" ").map(_.toInt)  <- will throw exception!
    val tried = numbers.split(" ").map(s => Try(s.toInt))  // Caught it!
    val good = tried.collect{ case Success(n) => n }
    

    당신은 (적어도) 세 가지 방법이 그래서 실패의 다른 유형에 대처하기 : 그것을위한 옵션은 작업하는 예상되는 동작하지 경우, / 일을하지 않았다 아니라 충격과 실패를 놀라운; 어느 사물이 작동 여부 (또는, 정말 당신이 두 개의 상호 배타적 인 옵션을 가지고있는 경우) 당신은 무엇이 잘못되었는지에 대한 정보를 저장할 수있는 경우에; 당신은 자신을 예외 처리의 전체 두통을하지 않을 때 시도,하지만 여전히 예외 행복 코드와 인터페이스 할 필요가있다.

    덧붙여, 예외가 좋은 예 있도록 - 당신이 더 자주 교과서에서 또는 다른 곳보다는 학습 자료를 찾을 수 있도록, 내 생각 : 교과서의 예제는 불완전 자주하는 수단이 일반적으로 신중한 설계에 의해 방지 될 심각한 문제한다고 대신 예외를 던져 플래그가.

    * 편집 : 세그먼테이션 폴트 (segfault)는 JVM 충돌에 관계없이 바이트 코드의 발생해서는 안됩니다; 도 예외는 도움이되지 않습니다. 내가 스택 오버 플로우를 의미했다.

    ** 편집 : (스택 추적 제외) 예외도 제어 스칼라의 흐름에 사용되는 - 라고요 실제로는 매우 효율적인 메커니즘, 그들은 라이브러리 정의 휴식 문 그 반환 같은 것들을 가능하게 비록 당신의 방법에서 반환 컨트롤은 실제로 하나 개 이상의 폐쇄에 전달했다. 대부분, 당신은 이것에 대해 자신을 걱정해야합니다, 당신은 실수로 이러한 제어 흐름 예외 중 하나 잡을 수 있으므로 모든 Throwables 처리를 잡는 것은 이러한 슈퍼 생각이 아니라는 것을 깨닫게하는 경우는 예외로합니다.

  2. ==============================

    2.이 스칼라 특별히 편의성 전이에서 / 상호 운용성과 기존의 언어와 환경, 특히 자바 기능 순도를 거래하는 장소 중 하나입니다 그래서. 그들은 equationally 불가능 이유에 참조 무결성을 깰 수 있도록 같은 기능 순도는 예외로 나뉩니다. (물론, 비 종료 재귀가 동일 할, 그러나 몇몇 언어는 그 불가능하게 할 제한을 적용하고자합니다.) 기능 순도를 유지하려면 사용 옵션 / 아마 / 하나 / 시도 / 검증, 모두 인코딩 성공 또는 referentially - 투명 유형으로 실패하고, 일을 명확하게하기 위해 그들이 제공하는 다양한 고차 함수 또는 기본 언어 특별 모나드 구문을 사용합니다. 또는, 스칼라, 당신은 단순히 긴의 상황이 단기간에 쉽게하지만 더 어렵게 만들 수 있음을 알고, 기능 순도 도랑를 결정할 수 있습니다. 이 스칼라 또는 변경 가능한 컬렉션, 또는 로컬 "VAR"의에서 "널 (null)"를 사용하는 것과 비슷합니다. 온화 부끄러운, 그리고 그것의 다량을하지 않지만, 모두가 마감 아래입니다.

    이 스칼라 특별히 편의성 전이에서 / 상호 운용성과 기존의 언어와 환경, 특히 자바 기능 순도를 거래하는 장소 중 하나입니다 그래서. 그들은 equationally 불가능 이유에 참조 무결성을 깰 수 있도록 같은 기능 순도는 예외로 나뉩니다. (물론, 비 종료 재귀가 동일 할, 그러나 몇몇 언어는 그 불가능하게 할 제한을 적용하고자합니다.) 기능 순도를 유지하려면 사용 옵션 / 아마 / 하나 / 시도 / 검증, 모두 인코딩 성공 또는 referentially - 투명 유형으로 실패하고, 일을 명확하게하기 위해 그들이 제공하는 다양한 고차 함수 또는 기본 언어 특별 모나드 구문을 사용합니다. 또는, 스칼라, 당신은 단순히 긴의 상황이 단기간에 쉽게하지만 더 어렵게 만들 수 있음을 알고, 기능 순도 도랑를 결정할 수 있습니다. 이 스칼라 또는 변경 가능한 컬렉션, 또는 로컬 "VAR"의에서 "널 (null)"를 사용하는 것과 비슷합니다. 온화 부끄러운, 그리고 그것의 다량을하지 않지만, 모두가 마감 아래입니다.

  3. from https://stackoverflow.com/questions/12886285/throwing-exceptions-in-scala-what-is-the-official-rule by cc-by-sa and MIT license