Идея обработки исключений заключается в том, что вы можете обрабатывать ошибки в тех точках потока вашей программы, где вы можете эффективно их устранять. Вместо того, чтобы проверять возвращаемое значение каждой функции, как в C, где большую часть времени вы не можете сделать ничего разумного, кроме как передать ошибку дальше, вы устанавливаете блок try / catch в разумных точках в вашей программе :
По сути, всякий раз, когда есть момент, когда вы можете осмысленно отреагировать на ошибку, затем перехватите эту ошибку и передайте все остальное. Таким образом, обработка ошибок вызывается только при вероятном восстановлении после ошибки.
Например, наихудший случай, если ошибка any не позволяет вашей программе значимо выполняться, тогда вы можете почти ничего не перехватить и просто позволить ОС справиться с ситуацией (ну, возможно, одна попытка / отлов) создать дружеское сообщение об ошибке).
Пример (в C ++, извините, я не могу набрать Java вслепую):
int main()
{
try {
while (masterloop()) { }
catch (...) {
LOG("Fatal program error, terminating!"); // nothing else we can do!
}
}
/* lots of program logic */
void process_image()
{
try {
Image im = load_image_from_disk();
/* ... */
}
catch (const OutOfMemoryExc & e) {
LOG("Not enough memory to process the image.");
return;
}
catch (const DataErrorExc & e) {
LOG("Could not read the image data.");
return;
}
catch (...) {
throw; // pass everything else along
}
}
В этом примере мы можем попытаться обработать изображение и потерпеть неудачу по некоторым ожидаемым причинам (нехватка памяти или невозможность прочитать изображение). В этом случае мы просто возвращаемся без выполнения работы и позволяем программе продолжаться изящно. Все остальные ошибки распространяются до более высокой точки. Самое главное, нам не нужно постоянно засорять реальную функцию обработки изображений проверками на ошибки и ответами, достаточно, чтобы любой код там выбросил одно из двух наших хороших исключений и больше не беспокоился.
Мораль: Если у вас есть блоки try / catch абсолютно везде, вы делаете это неправильно.