о с ++ попробуйте -catch - PullRequest
       1

о с ++ попробуйте -catch

2 голосов
/ 19 сентября 2011

Я читаю код в большом проекте, который включает в себя много кода, такого как:

try
{
}
catch(...)
{
}

Буквально, в скобках после слова "catch" есть слово "...".Не что-то вроде «исключения е».

Это заставляет меня немного волноваться.Эта практика хороша или безопасна?спасибо.

Ответы [ 3 ]

11 голосов
/ 19 сентября 2011

Нет, это ужасная практика.

Если вы catch(...), вы понятия не имеете, что вы поймали. Он перехватывает все исключения C ++ (и на некоторых платформах с некоторыми настройками он перехватывает и другие исключения, например структурированные исключения в Visual C ++).

Если вы не знаете, какое исключение было сгенерировано, вы не представляете, в каком состоянии находится система: как узнать, безопасно ли продолжать работу программы?

Единственный способ полностью безопасно выйти из блока catch(...) - это завершить программу или сбросить исключение (используя throw;). Последнее иногда полезно, если вам нужно выполнить некоторую очистку, когда выдается исключение, но вы не можете полагаться на деструктор.

3 голосов
/ 19 сентября 2011

catch(...) перехватывает все исключения.

Обычно вы этого не захотите.Вы понятия не имеете, что вы только что поймали, и если вы выходите из блока catch, вы просто молча игнорируете какую-то ошибку.Это может привести к очень плохим вещам, происходящим позже.Поскольку вы понятия не имеете, какая ошибка только что произошла, у вас нет способа ее исправить, и поэтому единственно разумным решением является либо разрешить продолжение исключения (повторно вызвать его), либо прервать выполнение программы (вызов * 1006).* или exit()).

Однако, если у вас есть какая-то очистка, которую вам нужно выполнить, может быть разумно перехватить все исключения, выполнить очистку, а затем повторно выбросить исключение:

try {
  // ...
} catch (...) {
  abortTransaction();
  throw;
}

Тем не менее, обычно лучше использовать так называемые RAII-классы для автоматизации этой очистки:

DBTransaction txn = db.StartTransaction();

// do stuff that may throw; if it throws, txn will be destroyed,
// and its destructor can abort the transaction
// As such, an explicit try { } catch(...) { } isn't needed
1 голос
/ 19 сентября 2011

Ловит все исключения.См. Этот код:

try {
   throw CSomeOtherException();
}
catch(...) {  // Handle all exceptions
   // Respond (perhaps only partially) to exception
   throw;       // Pass exception to some other handler
}

С MSDN

Вам не нужно объявлять этот параметр;во многих случаях может быть достаточно уведомить обработчик о возникновении определенного типа исключения.Однако, если вы не объявите объект исключения в объявлении исключения, у вас не будет доступа к этому объекту в предложении обработчика catch.

Выражение throw без операнда перебрасывает исключение, которое в данный момент находитсяобрабатываются.Такое выражение должно появляться только в обработчике catch или в функции, вызываемой из обработчика catch.Переброшенный объект исключения является исходным объектом исключения (не копией).Например:

Надеюсь, это поможет!

Эта практика безопасна, только если у вас есть соответствующие обработчики, написанные для исключений.По моему мнению, лучше избегать этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...