В чем разница между catch (...) и catch (CException *)? - PullRequest
4 голосов
/ 14 сентября 2011

CException - это базовый тип всех исключений, выдаваемых VC ++, поэтому он должен перехватывать все исключения, верно?

Ответы [ 3 ]

13 голосов
/ 14 сентября 2011

CException - это , а не базовый тип для всех расширений (это может быть базовый тип всех исключений, которые использует код MFC, но это далеко не так).

В C ++ вы можете выбросить что угодно ;он не должен быть подклассом «исключения» и даже не должен быть объектом.Например, совершенно законно писать throw 42; или throw new std::vector<string>();

Разница тогда очевидна: catch(CException) будет отлавливать только брошенные экземпляры CException и его подклассов, тогда как другой перехватит что-нибудь.

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

C ++ исключения могут быть любого типа. С помощью catch () вы указываете тип исключения, которое вы хотите перехватить в качестве параметра. Особый случай с (...) заключается в том, что вы поймаете любое другое исключение, которое вы не указали в предыдущих ловушках.

Основой исключений в C ++ для Стандартной библиотеки является std :: exception. Чтобы перехватить все исключения, стандартным способом в программе на C ++ является следующий:

(в основной функции, например)

try
{

}
catch( const std::exception & e )
{
// catch standard exceptions, you can use e.what() to know what exception you caught
}
catch( ... )
{
// catch all other types but you can't do much with them
}

Не рекомендуется, даже если это возможно, создавать собственные исключения, которые не наследуются от std :: exception. Но CException, похоже, не наследует его.

В вашем случае я посоветую вам сделать следующее, чтобы перехватить все исключения, которые могут возникнуть (опять же, например, в вашей основной функции и в функциях основного потока):

try
{
}
catch( const CException & e )
{
// catch all CExceptions
//as far as I know it is ok now to catch CException by reference with modern Microsoft compilers? It was not always the recommended microsoft way
}
catch( const std::exception & e )
{
// catch standard C++ exception
}
catch( ... )
{
// catch others
}

Как всегда, когда к нему не привыкли, может быть сложно узнать, что такое стандарт C ++ и что такое Windows API.

2 голосов
/ 14 сентября 2011
throw "ex";

фактически выдаст строку (ну, const char*, но вы понимаете, о чем я).

catch (TYPE t)

будет ловить только объекты типа TYPE (не обязательно должен бытьисключение).

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