Я так понимаю, throws писать не принято, а, на мой взгляд, у метода должен быть контракт, который сразу показывает, что метод может выкинуть
sealed class с dataclass-подтипами Success Fail — самый явный контракт. Внутри Success твой payload, внутри Fail может быть как исключение, так и enum код ошибки какой-то
Лично мой опыт. Если ошибка вызыванного метода может быть обработана особым образом и исправлена вызывающим, то Result<T, TError>, где TError закрытый силед тип (discriminated union). Если там просто про отсутствие результата, то нулабл. Если там кардинальный ахтунг (дб недоступна, сервис не отвечает), то просто бросаю исключение. Вызывающий явно такое обработать не в состоянии.
Трай кетчей у меня очень мало в коде, на глобальном евентлупе (если это воркер) или на весь реквест пайплайн (если это апи)
А если я хочу exception-style, а не monad-style(Ну или как это назвать)? Exception - это более spring-way, мне кажется, иначе придется в контроллере раскрывать Result, а не очень хочется
Мне как-то не нравится смешивать два подхода к обработке ошибок
Это прагматично. Исключения для исключительных ситуаций. Монады для обычных
То всегда есть Java 🙂 Исключения в котлине только для исключительных ситуаций (ошибки I/O, нарушенные инварианты), они всегда unchecked. Можно, конечно, их в документации описать, но это не самое надёжное средство заставить их обрабатывать.
Нет, я и в джаве использовала только unchecked(checked-исключения были очень плохой идеей), на мой вгзляд, это позволяет вызывающему как-то составить представления о том, что может случиться, о том, что он мог бы обработать, а что пусть летить наверх. Но с монадами сложнее, так как я не видела примера, насколько он приживется в спринге(Какой-нибудь @Transactional нужно исключение, что бы сделать rollback, скорее всего, это как-нибудь можно правильно обернуть, конечно, но все же)
Ну если вы в джаве не использовали checked исключения, вы можете просто писать такой же код. Да, с Result/Either спринговые прокси вряд ли поймут, что происходит.
Т.е. в доке просто писать, что он кидает, понятно, спасибо
можно ещё аннотацию Throws на функцию повесить https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-throws/
Обсуждают сегодня