2011-07-31 7 views
13

저는 현재 URL을 가져오고 해당 웹 페이지의 HTML로 Option [String]을 반환하려고하는 스칼라 도우미 메서드가 있습니다.URL을 가져올 때 None을 반환하거나 예외를 throw하는 것이 좋습니다.

예외 (잘못된 URL, 읽기 시간 초과 등)가 있거나 문제가있는 경우 없음을 반환합니다. 문제는 호출 코드가 예외를 기록 할 수 있도록 예외를 던지거나이 경우 None을 반환하는 것이 더 바람직할까요?

+1

도우미 메서드 인 경우 개인적인 것으로 가정합니다. 그것이 사적인 것이라면, 당신은 발신자입니다. 당신이 호출자라면, 당신은 일어날 일에 대한 모든 정보를 가지고있는 사람입니다. 그래서 당신이 원하는 것을하십시오. 그렇지 않으면 Jean의 대답을 참조하십시오. – agilesteel

답변

32

예외를 생성하려면 스택 추적을 채워야하므로 비용이 많이 듭니다. 던지기 및 잡기 예외는 또한 정상적인 수익보다 비쌉니다. 당신이 자신에게 다음과 같은 질문을 수도 있음을 고려 :

  • 당신은 호출자가 오류의 처리를 강제 하시겠습니까? 그렇다면 예외를 발생시키지 마십시오. 스칼라에는 호출자가 강제로 catch하는 체크 예외 메커니즘이 없으므로 예외를 throw하지 마십시오.

  • 오류가 발생한 경우 오류가 발생한 이유에 대한 자세한 정보를 포함 하시겠습니까? 그렇지 않은 경우 Option[A]을 반환 할 수 있습니다. A이 반환 유형이고 추가 설명이없는 Some(validContent) 또는 None 중 하나입니다. 그렇다면 Either[E, A] 또는 Scalaz Validation[E, A]과 같은 것을 반환 할 수 있습니다. 이 옵션을 모두 사용하면 호출자가 원하는대로 오류 E을 처리 할 수있는 동안 결과를 언 래핑해야합니다. 이제 E은 무엇이되어야합니까?

  • 실패한 경우 스택 추적을 제공 하시겠습니까? 만약 그렇다면 으로, Either[Exception, A] 또는 Validation[Exception, A]으로 반환 할 수 있습니다. 예외가 실제로 발생한 경우 을 사용하고 두 가지 가능한 경우는 Failure(exc: Throwable)Success(value: A)입니다. 물론 throwable을 생성하는 데 드는 비용이 발생합니다. 그렇지 않다면 Either[String, A]을 반환 할 수 있습니다. 여기에서 Right이 성공 또는 실패를 의미하는지 특별히주의하십시오. Left은 일반적으로 오류 용으로 사용되며 Right은 "올바른"값인 Validation이 더 분명 할 수 있습니다. 당신이 선택적으로 스택 추적을 반환 하려는 경우, 당신은 (여기까지 Option[A] 매우 유사) 추가 설명과 Full(validContents), Empty이 될 수있는 리프트의 Box[A]를 사용하거나 나타낼 수있는 오류 문자열을 저장할 수있는 Failure 및/또는 던지기 가능 (그리고 그 이상).

  • 왜 실패했는지 여러 가지 표시를 제공하고 싶습니까? 그런 다음 Either[Seq[String], A]을 반환하십시오. 이 작업을 자주 수행하는 경우 Scalaz와 Validation[NonEmptyList[String], A]을 대신 사용하는 것이 좋을 수 있습니다. 그것에 대한 자세한 정보를 보거나 these usage examples을 확인하십시오.

+0

요약하자! 개인적으로, 저는 [String, ...]을 사용합니다. Scalaz의 검증은 더 명확 해 보입니다. –

1

이 경우 예외를 로그하는 것이 중요하다면 예외를 던지십시오 (그리고 아마도 옵션 대신 String을 반환 할 수도 있습니다). 그렇지 않으면 None 만 반환 할 수 있습니다. 하나의 경고 - 예측할 수없는 다른 이유로 예외가있을 수 있습니다.이 경우 모든 코드를 포착하는 것이 위험 할 수 있습니다.

당신이 할 수있는 한 가지는 Lift의 Box 시스템과 같은 것입니다.A Box는 본질적으로 옵션이지만 몇 가지 기능이 추가되었습니다. A FullSome과 같으며 EmptyNone과 비슷하지만 Lift는 더 나아가서 Failure입니다. 이유는/Empty이지만, 메시지.

0

일반적으로 "예외를 처리 할 수 ​​있다면 처리하십시오"라는 규칙이 적용됩니다. 그러므로 추측할만한 컨텍스트가 없습니다. tryFetchUrl/fetchUrl 메소드 쌍을 사용할 수 있습니다.

관련 문제