7

私がキャッチしている場合BaseException、これはから派生する例外もキャッチしBaseExceptionますか?例外処理は継承などを考慮しますか、それともキャッチされた正確な例外タイプにのみ一致しますか?

class MyException {
...
};
class MySpecialException : public MyException {
...
};

void test()
{
 try {
 ...
 }
 catch (MyException &e) {
   //will this catch MySpecialException?
 }
}
4

5 に答える 5

7

コードで簡単に説明できます:http://ideone.com/5HLtZ

#include <iostream>

class ExceptionBase {
};

class MyException : public ExceptionBase {
};

int main()
{
    try
    {
        throw MyException();
    }
    catch (MyException const& e) {
        std::cout<<"catch 1"<<std::endl;
    }
    catch (ExceptionBase const& e) {
        std::cout<<"should not catch 1"<<std::endl;
    }

    ////////
    try
    {
        throw MyException();
    }
    catch (ExceptionBase const& e) {
        std::cout<<"catch 2"<<std::endl;
    }
    catch (...) {
        std::cout<<"should not catch 2"<<std::endl;
    }

    return 0;
}

出力:
キャッチ1
キャッチ2

于 2012-10-11T13:24:29.693 に答える
6

C ++の例外処理は、例外サブクラスと一致します。ただし、最初のcatch()から最後まで線形検索を実行し、最初のものにのみ一致します。したがって、BaseとDerivedの両方をキャッチする場合は、最初にcatch(MySpecialException&)を実行する必要があります。

于 2012-10-11T13:16:13.903 に答える
3

はい、そうなります。これは非常に一般的です。std::exceptionたとえば、スローされた例外がまたはのような派生例外である可能性が高いという事実にもかかわらず、キャッチするのが一般的std::bad_allocですstd::runtime_error

実際にベースタイプと派生タイプをキャッチすることができ、それらは順番にキャッチされますが、最初に派生タイプをキャッチする必要があります。

try
{
   // code which throws bad_alloc
}
catch ( const std::bad_alloc & e )
{
   // handle bad_alloc
}
catch ( const std::exception & e )
{
   // catch all types of std::exception, we won't go here 
   // for a bad_alloc because that's been handled.
}
catch ( ... )
{
   // catch unexpected exceptions
   throw;
}
于 2012-10-11T13:16:34.997 に答える
1

はい、ベースから派生した例外をキャッチします。

于 2012-10-11T13:14:29.840 に答える
1

含む

クラスExceptionBase{};

クラスMyException:public ExceptionBase {};

int main(){try {throw MyException(); } catch(MyException const&e){std :: cout << "catch 1" <

////////
try
{
    throw MyException();
}
catch (ExceptionBase const& e) {
    std::cout<<"catch 2"<<std::endl;
}
catch (...) {
    std::cout<<"should not catch 2"<<std::endl;
}

return 0;
于 2013-04-24T08:40:12.763 に答える