Лучше вернуть None или выбросить исключение при получении URL-адреса?
У меня есть вспомогательный метод Scala, который в настоящее время пытается получить URL-адрес и вернуть опцию[String] с HTML этой веб-страницы.
Если есть какие-либо исключения (искаженный url, тайм-ауты чтения и т. д...) или если есть какие-либо проблемы, он возвращает None. Вопрос в том, было бы лучше просто выбросить исключение, чтобы вызывающий код мог регистрировать исключение или предпочтительнее вернуть None в этом случае?
3 ответов
создание исключений дорого, потому что трассировка стека должен быть заполнен. Бросать и ловить исключения также дороже, чем обычный возврат. Учитывая это, вы можете задать себе следующие вопросы:--26-->
вы хотите принудительно обработать ошибку вызывающим абонентом? если это так, не бросайте исключение, так как Scala не имеет механизма checked-exception, который заставляет вызывающего абонента ловить их.
в случае ошибки, вы хотите включить подробную информацию о том, почему это не удалось? если нет, вы можете просто вернуть
Option[A], гдеAваш тип возврата, и тогда ты либоSome(validContent)илиNone, без дополнительных объяснений. Если да, вы можете вернуть что-то вродеEither[E, A]или ScalazValidation[E, A]. Все эти параметры заставляют вызывающего абонента как-то разворачивать результат, будучи свободным для обработки ошибкиEкак он хочет. А теперь чтоEбыть?вы хотите предоставить трассировку стека в случае неудачи? если да, то ты мог бы возвращение
Either[Exception, A]илиValidation[Exception, A]. Если вы действительно идете с исключением, вы захотите использоватьTry[A], два возможных случая которыхFailure(exc: Throwable)иSuccess(value: A). Обратите внимание, что вы, конечно, понесете расходы на создание throwable. Если нет, вы можете просто вернутьEither[String, A](и будьте очень осторожны, чтобы помнить, является лиRightозначает успех или неудача здесь -Leftобычно используется для ошибок, иRightдля "правильных" стоимостьюValidationвозможно, понятнее). Если вы хотите дополнительно верните трассировку стека, вы можете использовать Lift'sBox[A], что может бытьFull(validContents),Emptyбез дополнительного объяснения (очень похоже наOption[A]здесь), или указатьFailureкоторый может хранить строку ошибки и / или throwable (и многое другое).возможно, вы хотите предоставить несколько почему он провалился? затем вернуться
Either[Seq[String], A]. Если вы делаете это часто, вы, вероятно, хотите использовать Scalaz иValidation[NonEmptyList[String], A]вместо этого, который предоставляет некоторые другие приятные вкусности. Посмотрите его для получения дополнительной информации об этом или проверьте эти примеры использование.
Я думаю, что в этом случае, если важно регистрировать исключения, то непременно бросьте исключения (и, возможно, просто верните строку вместо опции). В противном случае вы можете просто вернуть никто. Одно предупреждение - могут быть исключения по другим причинам, которые вы не предвидите, и в этом случае может быть опасно сделать весь бит кода.
одна вещь, которую вы могли бы сделать, это что-то вроде лифта
общее эмпирическое правило: "если вы можете обработать исключение, обработайте его". Так что не хватает контекста, чтобы догадаться. Можно использовать пару методов tryFetchUrl/fetchUrl.