Правильное использование Either, Try и Exceptions / ControlThrowable в Scala - PullRequest
0 голосов
/ 13 февраля 2019

В моем коде scala (библиотеках, а также приложениях) я в настоящее время использую смесь Option и Try, когда каждый из них кажется более подходящим.

Я стремлюсь реализовать методы "doSomething", которые могут преуспеть с возвращаемым значением или с ошибкой Try.То есть они могут содержать код, который выбрасывает , или, когда я обнаруживаю ошибки «вручную», я искусственно создаю Throwable и возвращаю Failure.Возвращаемое значение этих методов, следовательно, равно Try[ReturnType].

Теперь я прочитал, что создание исключений несколько неоптимально, поскольку создает трассировку стека (и, следовательно, медленно), которая мне даже не нужна.Я также видел примеры использования подкласса ControlThrowable, который не создает трассировку стека, однако у них также нет сообщения, и Try, конечно, не поймает его.

Теперьмой конкретный вопрос был бы, должен ли я вообще отдавать предпочтение Either над Try, когда я хочу выполнить обработку ошибок во время выполнения / возвращаемые значения метода, и использовать Try только в ситуациях, когда мне действительно нужно перехватить что-то (например, код третьей стороны)?
Таким образом, мне бы не пришлось создавать неуклюжие Throwable s, а вместо этого использовать, например, только строки в Left для ошибок.

Так что в основном:

  • Option: ежедневное использование для чего-то, что обычный имеет значение или нет
  • Try: перехват исключений внутри методов, но не используется как возвращаемое значение
  • Either: универсальное возвращаемое значение, содержащее ошибку (строку) или значение успеха

Сработает ли эта концепция, или существует более жизнеспособный / общий подход?

1 Ответ

0 голосов
/ 13 февраля 2019

Как сказал Трэвис Браун в комментариях, настоящее соглашение не существует, и это в значительной степени культурная вещь.Согласованность - это самое важное, чтобы ваш код читался.Я видел кодовые базы, которые:

  • Используйте «Опции», чтобы обозначить «None - успех, а любой Some(...) содержит сообщение об ошибке»
  • . Используйте «Try» для возвратаУспех, содержащий пустую строку или Сбой, содержащий сообщение об ошибке
  • Использовать либо в обратном направлении (т. е. Either[?, Throwable])

Очевидно, что это не хорошие практики, но какПока вы последовательны, это не имеет значения.Соглашение, которое я лично использую как для отдыха, так и на работе:

  • Option для случаев, когда допустимо пропустить значение (например, при разборе JSON с использованием playframework).
  • Try при попытке сделать что-то, что может потерпеть неудачу (если это не в будущем, в этом случае я просто использую .recover), где мне нужно сопоставить тип исключения, нотакже хотите получить результат Успеха, если он доступен.
  • Either, когда я не хочу возвращать исключение / Throwable в моем случае «сбой» (хотя, честно говоря, эторедко).

Независимо от того, что из вышеперечисленного я использую, я лично считаю, что лучше держать его как можно дольше как можно быстрее.Это останавливает ненужные броски Throwables в вашем коде (хаха) и упрощает отладку, так как нет никаких скрытых getOrElse строк, возвращающих значения по умолчанию (это может очень раздражать в больших кодовых базах).

...