构造函数中的函数try-block:exception escapes

时间:2018-03-15 09:34:43

标签: c++ exception constructor try-catch

我听说function-try-block可用于普通函数,成员函数,构造函数等。我想证实一下这个事实。但是在使用构造函数时,我遇到了一个我不理解的行为。

代码是这样的:

#include <iostream>
using namespace std;

void throws() {
    throw "Exception"; //throw an exception of string literal
}

class C {
    public:

        //constructor1
        C() try {
            throws();
        } catch (const char *) {
            cout << "Catched an exception.\n";
        } catch (...) {
            cout << "Unknown exception.\n";
        }

        //constructor2
//         C() {
//             try {
//                 throws();
//             } catch (const char *) {
//                 cout << "Catched an exception.\n";
//             } catch (...) {
//                 cout << "Unknown exception.\n";
//             }
//         }

};

int main() {

    C c; //=> "Catched an exception"
         //then error occurs
         //with a message "uncaught exception of type char const*"

}
  • constructor1

    在创建类C的对象时,会通过函数throws()抛出异常,并且它会被捕获,以便输出消息"Catched an exception."。但是,异常传播并使程序终止。

  • constructor2

    输出消息,异常不会传播。

constructor1constructor2在语法上是否相同?

环境:

$ gcc --version

Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.4.0
Thread model: posix

0 个答案:

没有答案