Здравствуйте, vaa, Вы писали:
vaa>Почему в расте отсутствует выброс исключений? Это же удобный способ передачи управления.
Это достаточно сложный, спорный вопрос со множеством мнений.
Кому то нравится когда контракт возвращаемого результата прописан в результирующем значении функции явно (Result<T>) без скрытого контракта на взвесь "каких то" exceptions, которые код может кинуть (исключения не документируются кодом. Хорошо если в комментах что то написано, но никаких гарантий что не прилетит что то ещё). Кому то нравится обрабатывать ошибку на месте, потому что когда она выплёвывается выше и выше — всё меньше шансов обработать её правильно.
Исключения добавляют второй слой обработки ошибок, и часто становится непонятно, ошибка, например, открытия файла — это исключение или просто вернуть код ошибки. Часто приводит к дупликации API для обоих стилей. Исключения легко забыть необработать, пропущенный stoi() гденть в невинном месте может убить сервер.
То что есть в Расте тоже удобно, ошибки возвращаются явно и если нет нужды обрабатывать на месте, просто прокидываются вверх '?' оператором. Но каждое написание '?' заставляет тебя на секунду задуматься, что можно тут сделать если операция вернула ошибку.
Я на самом деле не против исключений. Просто рассматриваю как альтернативу для сценариев где это действительно нужно. Например в С++ из конструктора никак не вернуть код ошибки и используются исключения. Но в Расте конструкторов нет — всё, обычные функции.
Исключения добавить будет можно всегда, вот тут нагуглился
RFC0243 который они ещё обсуждают. Помоему он хорошо резюмируется вот такой цитатой:
No expressivity is added, only convenience. Some object to "there's more than one way to do it" on principle.
vaa>Или быть может существует более продвинутый механизм наподобие Common Lisp Condition System ?
Не слышал.