Чем неудобны исключения? Если я вызвал метод/функцию, я хочу получить результат ее работы. Кому нужны исключения например от неправильного формата отданного в sprintf? Для того, что бы юзать спринтф, мне не нужно знать какие исключения она генерирует, потому что исключение - исключение из правил, исключение из алгоритма. Для юзания спринтфа мне достаточно взглянуть на прототип этой функции. Если я использую что то, что генерирует исключения (пусть это библиотека), значит я обязательно должен предусматривать возможность их обработки. При чем в тех местах, где мой код взаимодействует с кодом библиотеки. Во всех этих местах код утолщается за счет try/catch-ей, которые я просто вынужден там ставить, если хочу получить стабильный код. Этого не видно, пока не напишешь. Это снаружи все превращается в изящный одновариантный отлов, когда вам всего то надо вывести сообщение об ошибке. А чем глубже, тем больше. С исключениями вместо того, что бы обработать только результат функции, приходится отлавливать и все возможные исключение, при чем отлавливать их каждый раз, когда они могут возникнуть, а не один раз где то снаружи, как пытаются представить некоторые.