저는 현재 URL을 가져오고 해당 웹 페이지의 HTML로 Option [String]을 반환하려고하는 스칼라 도우미 메서드가 있습니다.URL을 가져올 때 None을 반환하거나 예외를 throw하는 것이 좋습니다.
예외 (잘못된 URL, 읽기 시간 초과 등)가 있거나 문제가있는 경우 없음을 반환합니다. 문제는 호출 코드가 예외를 기록 할 수 있도록 예외를 던지거나이 경우 None을 반환하는 것이 더 바람직할까요?
저는 현재 URL을 가져오고 해당 웹 페이지의 HTML로 Option [String]을 반환하려고하는 스칼라 도우미 메서드가 있습니다.URL을 가져올 때 None을 반환하거나 예외를 throw하는 것이 좋습니다.
예외 (잘못된 URL, 읽기 시간 초과 등)가 있거나 문제가있는 경우 없음을 반환합니다. 문제는 호출 코드가 예외를 기록 할 수 있도록 예외를 던지거나이 경우 None을 반환하는 것이 더 바람직할까요?
예외를 생성하려면 스택 추적을 채워야하므로 비용이 많이 듭니다. 던지기 및 잡기 예외는 또한 정상적인 수익보다 비쌉니다. 당신이 자신에게 다음과 같은 질문을 수도 있음을 고려 :
당신은 호출자가 오류의 처리를 강제 하시겠습니까? 그렇다면 예외를 발생시키지 마십시오. 스칼라에는 호출자가 강제로 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을 확인하십시오.
요약하자! 개인적으로, 저는 [String, ...]을 사용합니다. Scalaz의 검증은 더 명확 해 보입니다. –
이 경우 예외를 로그하는 것이 중요하다면 예외를 던지십시오 (그리고 아마도 옵션 대신 String을 반환 할 수도 있습니다). 그렇지 않으면 None 만 반환 할 수 있습니다. 하나의 경고 - 예측할 수없는 다른 이유로 예외가있을 수 있습니다.이 경우 모든 코드를 포착하는 것이 위험 할 수 있습니다.
당신이 할 수있는 한 가지는 Lift의 Box
시스템과 같은 것입니다.A Box는 본질적으로 옵션이지만 몇 가지 기능이 추가되었습니다. A Full
은 Some
과 같으며 Empty
은 None
과 비슷하지만 Lift는 더 나아가서 Failure
입니다. 이유는/Empty
이지만, 메시지.
일반적으로 "예외를 처리 할 수 있다면 처리하십시오"라는 규칙이 적용됩니다. 그러므로 추측할만한 컨텍스트가 없습니다. tryFetchUrl/fetchUrl 메소드 쌍을 사용할 수 있습니다.
도우미 메서드 인 경우 개인적인 것으로 가정합니다. 그것이 사적인 것이라면, 당신은 발신자입니다. 당신이 호출자라면, 당신은 일어날 일에 대한 모든 정보를 가지고있는 사람입니다. 그래서 당신이 원하는 것을하십시오. 그렇지 않으면 Jean의 대답을 참조하십시오. – agilesteel