스칼라에서 확인되지 않은 예외에 대한 결정


17

Java 프로그래머로서, 나는 항상 점검되지 않은 예외를 비판했습니다. 대부분의 프로그래머는 나중에 쉽게 문제를 일으킬 수 있도록 코딩 편의를위한 경로로 사용합니다. 또한 예외를 확인한 프로그램 (단순하지는 않지만)은 확인되지 않은 상대방에 비해 훨씬 강력합니다.

놀랍게도 스칼라에는 Checked Exceptions라는 것이 없습니다. 스칼라에서는 모든 Java가 선택 및 선택 해제되어 있습니다.

이 결정의 동기는 무엇입니까? 나를 위해 외부 코드를 사용할 때 광범위한 문제가 발생합니다. 우연히 문서가 열악하면 KILL이 발생합니다.


11
Java 프로그래머로서 나는 항상 확인 된 예외를 비판했습니다. 어수선한 코드는 결코 강력 하지 않습니다 .
Michael Borgwardt

답변:


28

확인 된 예외는 대부분 실패로 간주됩니다. Java를 채택한 후에 작성된 언어는 없습니다. 참조 http://www.artima.com/intv/handcuffs2.html , http://googletesting.blogspot.ru/2009/09/checked-exceptions-i-love-you-but-you.html , / : HTTP를 /www.mindview.net/Etc/Discussions/CheckedExceptions

특히, 구성 할 수 없습니다 (로 되돌림 제외 throws Exception).

스칼라에서 당신은 더 나은 옵션이 있습니다 : 같은 반환 값 대수 유형을 사용하여 Option[T], Either[Exception, T]자신의 유형 당신은 예를 들어, 대신 (핸들 특정 경우에 사용자를 할 때

def foo: Int // throws FileNotFoundException, IllegalStateException

당신은 가지고

sealed trait FooResult
case class Success(value: Int) extends FooResult
case class FileNotFound(file: File) extends FooResult
case object IllegalState extends FooResult

def foo: FooResult

소비자는 이제 모든 결과를 처리해야합니다)

예외를 발생시키는 외부 코드를 다루기 위해서는 scala.util.control.exception또는 scala.util.Try(Scala 2.10부터 시작)이 있습니다.


4
대부분의 사람들이 확인 된 예외 인수를 처리하지 않는다는 것을 이해 하지 못했습니다 . 대부분의 사람들은 좋은 개발자가 아닙니다. 나는 대부분의 개발자가 어쨌든 오류 결과를 처리하지 않을 것을 보장합니다. 실제로, try..catch보다 읽기 쉬운 것으로 보입니다 if. 무엇보다 나는 또한 그 같은 것을 보장 할 수있어 대부분의 개발자들이 너무 스칼라 복잡 - - 반환 오류 결과가 있음을 쓰기 코드에 갈 수 없습니다 당신도 당신이 (단지 파스칼처럼) 할 때마다 함수에서 반환 할 수 없습니다
Pijusn

5
@Pius, 혼란스럽고 증거가 부족하다는 의견이 있습니다. Scala에서 옵션 을 반환 유형으로 선택 하면 If 문이 아닌 패턴 일치가 발생할 수 있습니다 . 해당 스타일의 일부 가 아닌 None을 반환 하는 것은 사소한 것이지 복잡하지 않습니다. 덜 단호한 개발자는 대수 유형을 반환하는 함수를 작성하지 않을 수도 있지만 이는 다릅니다. 마지막으로“원할 때마다 함수에서 돌아올 수조차 없습니다.”– 단순히 사실이 아닙니다.
itsbruce

7

Java에서 확인 된 예외 는 그렇게 나쁘지 않습니다. 물론 ADT는 Scala에 더 적합한 옵션이지만 Java에서는 확인 된 예외가 대신하고 깔끔한 코드 인수는 블로그가 얼마나 많은 블로그를 반복하더라도 무의미합니다. 기본적으로 나사 유형 시스템, 예쁜 코드는 시스템을 자동으로 강력하게 만들기 때문에 시스템에서 발생할 수있는 가혹하고 수리 가능한 조건을 행복하게 무시해야한다고 말합니다 . 이러한 추론은 왜 많은 Java 코더가 자발적으로 코드를 XML로 옮길 수 있는지 설명합니다 (Spring, Maven 등. 나는 여기서 중요한 부분을 그리워합니다 ).

http://www.scala-lang.org/old/node/8787.html 아래 M. Odersky가 제공 한 Scala에서 확인 된 예외가없는 이유 는 놀랍지 않게 다르며 의미가 있습니다.

확인 된 예외의 문제점은 목록의 map 메소드로 가장 잘 설명됩니다.

def map[B](f: A => B): List[B]

@throws로지도에 주석을 달는 방법은 무엇입니까? map이 @throws 주석 자체를 얻지 못하면 @throws가있는 함수를 전달할 수 없습니다. 그것은 맵이 사용될 수있는 방법에 대한 번거로운 제한과 구별을 도입 할 것입니다. 어떻게 든 map이 함수 인수가 던지는 모든 예외를 던진다 고 말할 수 있다면 상황이 더 좋을 것입니다. 이것을 표현할 수있는 효과 시스템이 있지만, 지금까지 내가 본 모든 표기법이 너무 무겁습니다.

Lukas Rytz는지도 유형 및 기타 일반적인 기능을 간결하고 정확하게 표현하는 데 사용할 수있는 경량 효과 시스템에 대한 연구를 수행하고 있습니다. 그것은 연구이므로 현재 우리가 어느 정도의 성공을 거둘 것이며 스칼라에 얼마를 넣을 수 있는지는 확실하지 않습니다. 이상적으로는 선택적 유형 시스템으로 특정 시점에 추가 할 수 있습니다. 그러나 구체적인 예측을하기에는 너무 이르다.

건배

확실하지 않지만 Java 8 람다는 검사되지 않은 예외로 제한됩니다.JDK 8 ( java.util.function.*) 에서 대부분의 (모든?) 새로운 기능 인터페이스의 메소드는 검사되지 않은 예외도 선언하지 않습니다.


2

효율성을 얻으려면 포기해야합니다. 정밀 / 제어 <-더 나은 단어가 필요합니다.

스칼라는 추상화가 진행되는 한 정상을 향해 있습니다. 스칼라의 목표 중 하나가 성가신 상용구 코드를 제거하는 것이라면 Java의 예외 처리 방법을 살펴보아야합니다. Java로 빠른 코드를 작성하려면 확인 된 예외가 발생하여 main()효과적으로 확인되지 않을 때까지 계속 확인하십시오 .

나는 당신이 무엇을 요구하는지 정확히 알지 못하지만 이것이 내 의견에서 가장 분명한 이유입니다.

글쎄, 나는 조금만 보았고 누군가가 예외 점검의 비극에 대해 썼다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.