相关疑难解决方法(0)

C++中异常对象的范围

C++中异常对象的范围是什么?一旦执行catch处理程序,它是否会超出范围?另外,如果我创建一个未命名的异常对象并抛出它,那么在捕获该异常时,如果我通过const引用或非const引用捕获它是否重要?

c++ scope exception-handling

39
推荐指数
2
解决办法
8340
查看次数

异常对象的生命周期

我想知道如何创建异常对象?以及为什么处理函数参数可以是非const引用?

例如:

class E{
    public:
    const  char * error;
    E(const char* arg):error(arg){
    cout << "Constructor of E(): ";}

    E(const E& m){
        cout << "Copy constructor E(E& m): " ;
       error=m.error;
    }
};



int main(){
try{
    throw E("Out of memory");

}
catch(E& e){cout << e.error;}

}
Run Code Online (Sandbox Code Playgroud)

输出: E()的构造函数:内存不足

所以我有throw E("out of memory")E("out of memory")仅仅是一个临时对象,没有对象被创建除外E("out of memory"),因为没有拷贝构造函数被调用.所以即使这E("out of memory")只是一个临时对象,我有一个非const引用的处理程序.

你能解释一下为什么这是可能的吗?

c++ exception object lifetime

8
推荐指数
1
解决办法
1340
查看次数

std :: exception拥有什么?

我正在派生我自己的异常,调用它MyException,std::system_error从而重写what()以计算并返回我的消息.MyException的初始化列表不会调用带有消息的system_error构造函数覆盖.

如果我抓住一个MyException,并将其复制到std::exception调用的结果what()std::exception就是nullptr.这是有道理的.

我的问题是,如果我确实使用了在初始化时接收消息的system_exception的构造函数MyException,是否指定system_error将获取消息的副本并拥有它并释放它?

我假设这将使std::exception副本MyException能够返回有效的what().虽然我会在每次MyExceptions创建新内容时计算"什么"需要考虑性能.只有在首次调用what()时,我才能懒惰地计算它.

我有点担心'what'字符串的所有权what()返回a char*而不是a const std::string&.

代码是这样的(我还没有编译):

    class MyException : public std::system_error
    {
        std::string what_;
    public:
        MyException(int errorValue, const std::error_category& category)
            : std::system_error(errorValue, category)
        {}

        char* what() const
        {
           what_ = "MyException: " + to_string(code().value());
           return what_.c_str();
        }
    };

    int main()
    {
        std::exception ex;

        try
        { …
Run Code Online (Sandbox Code Playgroud)

c++ exception std system-error c++14

2
推荐指数
1
解决办法
811
查看次数