自定义异常类 - 奇怪的行为

时间:2014-07-31 10:59:22

标签: c++ class exception try-catch

我已经创建了一个自定义异常类testException

throw创建一个testException对象,在创建时会收到所需的异常名称。

当捕获testException(通过引用)时,它应该使用成员函数Get.Exception返回异常的名称。

由于某种原因,该函数未被调用,而是我收到错误:

terminate called after throwing an instance of testException

我看到了一个类似的例子here,据说应该可行。

  • 为什么我会收到上述错误?

代码:

Exception.h

#include <iostream>
#include <string>
#ifndef TESTEXCEPTION_H
#define TESTEXCEPTION_H

using std::cout;
using std::cin;
using std::endl;
using std::string;

class testException {
public:
    testException(string);
    string GetException();
    ~testException();
protected:
private:
    string myexception;
};

#endif // TESTEXCEPTION_H

Exception.cpp

#include "testException.h"

testException::testException(string temp) : myexception(temp) {
    // ctor
}

string testException::GetException() {
    return myexception;
}

testException::~testException() {
    // dtor
}

main.h

#include <iostream>
#include "testException.h"

using std::cout;
using std::cin;
using std::endl;

int main() {
    throw testException ("Test");
    try {
        // Shouldn't be printed if exception is caught:
        cout << "Hello World" << endl;
    } catch (testException& first) {
        std::cerr << first.GetException();
    }
    return 0;
}

2 个答案:

答案 0 :(得分:3)

您将异常抛出try块之外。

int main() {
    throw testException("Test"); // Thrown in main function scope.
                                  // Will result in call to terminate.
    try {
        /* ... */
    } catch (testException& first) {
        // Only catches exceptions thrown in associated 'try' block.
        std::cerr << first.GetException();
    }
    /* ... */
}

只有在try-catch子句的内部被抛出时才能捕获异常。在main函数范围内抛出异常将导致调用terminate

try块将“尝试”执行内部的所有内容,如果在此过程中抛出任何异常,如果关联的异常处理程序采用一个类型为抛出异常隐式的参数,它们将被捕获可转换为。

一旦抛出异常,将跳过try块中剩余的其余语句,所有具有自动存储持续时间的对象将被销毁,异常将被相应处理。

Live example with throw statement moved inside try-catch clause

答案 1 :(得分:2)

将投掷线:throw testException ("Test");移至try {} catch(catch (testException& first) {}区块。