Здравствуйте, SkyDance, Вы писали:
_>>Это как раз максимально удобно, потому что тут тебе IDE сама покажет место, куда необходимо вставить обработчик ошибок. Ведь для ошибок (а не критических ситуаций, которые обрабатываются паниками) как раз характерна обработка по месту, а не один глобальный обработчик на всё приложение.
SD>Вообще-то, в большинстве случаев ошибки обработать можно не "по месту" (где функция вызвана), а где-то десятком уровней выше по стеку. Для этого и нужны исключения, чтобы иметь возможность обработать ошибку не там, где она возникла, а там, где имеется достаточно информации для ее обработки.
Конечная обработка (в смысле показа сообщения пользователю) действительно обычно происходит где-то на несколько уровней выше точки возникновения ошибки. Но нюанс в том, что для нормальной обработки (показа информативного сообщения и т.п.) необходимо собрать контекстную информацию на почти каждом промежуточном уровне. Т.е. по сути если делаешь на исключениях, то надо их ловить вокруг каждого вызова функции и далее выбрасывать новое (с добавленной информацией этого уровня). Именно это я имел в виду, когда говорил о необходимости обработки по месту.
В Rust'е в принципе всё тоже самое, но есть пара нюансов. Во-первых в нём невозможно пропустить эту самую обработку (если достаточно перенаправить ошибку выше без всяких контекстов, то просто ставишь оператор "знак вопроса" в этой точке, но при этом ты явно видишь что здесь возможно возникновение ошибки и все возможные её типы). А во-вторых развиты средства её автоматизации (выглядит это например так
https://docs.rs/anyhow/latest/anyhow/).