Вам не нужно покрывать каждый блок с помощью try-catch, потому что try-catch может по-прежнему перехватывать необработанные исключения, возникающие в функциях, расположенных ниже по стеку вызовов. Таким образом, вместо того, чтобы каждая функция имела функцию try-catch, у вас может быть одна на логике верхнего уровня вашего приложения. Например, может существовать подпрограмма верхнего уровня SaveDocument()
, которая вызывает много методов, которые вызывают другие методы и т. Д. Эти под-методы не нуждаются в собственных попытках-ловцах, потому что если они выдают, он все равно перехватывается * 1004. * улов.
Это хорошо по трем причинам: это удобно, потому что у вас есть единственное место, чтобы сообщить об ошибке: SaveDocument()
блок (и) перехвата. Нет необходимости повторять это для всех под-методов, и в любом случае это то, что вам нужно: одно единственное место, чтобы дать пользователю полезную диагностику о том, что пошло не так.
Во-вторых, сохранение отменяется всякий раз, когда выдается исключение. При каждом попытке перехвата под-метода, если генерируется исключение, вы попадаете в блок catch этого метода, выполнение покидает функцию, и она продолжает до SaveDocument()
. Если что-то уже пошло не так, вы, вероятно, захотите остановиться прямо сейчас.
Три, все ваши под-методы могут предполагать, что каждый вызов успешен . Если вызов не удался, выполнение перейдет к блоку catch, а последующий код никогда не будет выполнен. Это может сделать ваш код намного чище. Например, вот с кодами ошибок:
int ret = SaveFirstSection();
if (ret == FAILED)
{
/* some diagnostic */
return;
}
ret = SaveSecondSection();
if (ret == FAILED)
{
/* some diagnostic */
return;
}
ret = SaveThirdSection();
if (ret == FAILED)
{
/* some diagnostic */
return;
}
Вот как это может быть написано с исключениями:
// these throw if failed, caught in SaveDocument's catch
SaveFirstSection();
SaveSecondSection();
SaveThirdSection();
Теперь стало намного понятнее, что происходит.
Заметьте, что безопасный код исключения может быть сложнее написать другими способами: вы не хотите терять память при возникновении исключения. Убедитесь, что вы знаете о RAII , контейнерах STL, интеллектуальных указателях и других объектах, которые освобождают свои ресурсы в деструкторах, поскольку объекты всегда уничтожаются до исключений.