Я бы добавил, что одной из ключевых причин наличия исключений является то, что ваше приложение должно обрабатывать ошибки на самом подходящем уровне кода, чтобы делать что-то разумное с ним. Исключения обеспечивают чистый способ передачи информации обратно в стек вызовов, чтобы включить это.
Решение о том, какой слой обрабатывать различные исключения, является ключевым решением при разработке вашего приложения. Тип приложения, которое вы разрабатываете, повлияет на решение.
например. При разработке веб-приложений или приложений для настольных компьютеров вполне допустимо обрабатывать большинство типов исключений только на очень высоком уровне. Этот метод может сэкономить много кода, когда ваше приложение в любом случае не может ничего сделать с ошибкой, и ему просто нужно сообщить кому-то и записать его.
Однако в критически важном многопоточном серверном приложении вам, вероятно, понадобится детальный контроль над исключениями, чтобы должным образом обрабатывать их и поддерживать вращение потоков, несмотря ни на что.