2012-02-27 2 views
1

Можно создать дубликат:
How can I catch all types of exceptions in one catch block?Есть ли способ поймать все исключения на C++?

В C++ есть способ, чтобы поймать все исключения? Если да, то какой будет синтаксис для этого?

Merci

+0

Необходимо уточнить; вы имеете в виду * все * исключения или * все необработанные * исключения? В конце концов, вы можете обернуть свою точку входа в блок try-catch, как упоминал Сет, но если есть внутренний код, который явно обрабатывает исключение и позволяет программе продолжить, он не ударит по блоку catch точки входа. –

+0

Если вы делаете это для отладки исключения, в Visual Studio есть более простой способ; В меню отладки перейдите к опции «Исключения», и вы можете выбирать опции для остановки VS, когда происходит какое-либо исключение, даже если оно обрабатывается, и несколько других вещей. –

+0

И, кстати, это типично «плохая форма». Особенно, если вы делаете что-то вроде 'try {...} catch (...) {; } '(т. е. молчат любые/все возможные исключения). – paulsm4

ответ

8

Да, вы можете перехватывать все исключения, которые не были обработаны (и не вызваны повторно) внутренними try/catch блоки catch ИНГ ...:

try { 
    // do some stuff 
} catch (...) { 
    // catch any exceptions that weren't handled and/or rethrown in the try block 
} 

Вы также можете совместить это с другими catch es, но убедитесь, что они выше catch (...), или они будут замаскированы уловкой (и вы должны получить ошибку компилятора).

+1

Это не обязательно исключает * любое * исключение, потому что те, которые обрабатываются во внутренних блоках try-catch и не останавливают выполнение программы, не перепутаны. –

+1

@RussC это правда, но ловить буквально каждое исключение невозможно с C++. –

+0

Согласен, но ваша формулировка непреднамеренно вводит в заблуждение; просто хотел удостовериться, что OP был осведомлен об области исключения. –

5

Вы можете перехватывать все исключения, как этот

try{ 
    // ... 
} catch (...) { 
    // ... 
} 

Однако более полезная вещь, чтобы сделать, это поймать конкретных исключений, а затем, наконец, попадают в (...)

try{ 
    // ... 
} catch (const std::exception& ex) { 
    // ... 
} catch (const std::string& ex) { 
    // ... 
} catch (...) { 
    // ... 
} 
1

Нет, вы не можете поймать ВСЕ исключения, потому что вы не можете поймать исключения, которые уже были пойманы другим обработчиком, вложенным в ваш блок try/catch.

Смежные вопросы