c++异常的问题

mz126 2015-08-17 11:40:46
我写了一个简单的测试程序。动态的开辟数组,然后输出数组中的每个元素。
由于是用c++写的,动态开辟内存的代码写在构造函数里面。我查看了c++ primer第四版p587函数测试块与构造函数的内容后,知道处理异常的代码写在构造函数里面。
可是这样写我有一个问题,就是一旦异常返回之后,那主函数应该怎么写?因为构造函数在异常处理中已经处理了异常,可是异常返回后主函数又没办法继续正常执行下面的代码。请大神指教主函数这里应该怎么写?
下面附上代码:

/*************************************************************************
> File Name: test.h
> Author: mz
> Mail:xx@qq.com
> Created Time: Mon 17 Aug 2015 10:34:43 AM CST
************************************************************************/
#ifndef TEST_test_h
#define Test_test_h
#include <memory>

namespace TEST
{

class CTest
{
public:

typedef std::shared_ptr<int> Ptr;

CTest( std::size_t size );
void show();

private:

std::size_t _size;
Ptr _arr;

};// CTest

}// TEST

#endif
/*************************************************************************
> File Name: test.cpp
> Author: mz
> Mail:xx@qq.com
> Created Time: Mon 17 Aug 2015 10:38:45 AM CST
************************************************************************/
#include "test.h"
#include <stdexcept>
#include <iostream>

using std::bad_alloc; using std::cerr; using std::endl;
using std::size_t; using std::cout;

namespace TEST
{

CTest::CTest( size_t size ) try
: _size( size ) , _arr( new int[size] )
{

}catch( const bad_alloc& e )
{
cerr << "bad_alloc caught : " << e.what() << endl;
}

void CTest::show()
{
for( size_t i = 0 ; i != _size ; ++i )
{
cout << _arr.get()[ i ] << " ";
}
cout << endl;
}

}
/*************************************************************************
> File Name: main.cpp
> Author: mz
> Mail:xx@qq.com
> Created Time: Mon 17 Aug 2015 11:19:16 AM CST
************************************************************************/
#include "test.h"
using TEST::CTest;

int main()
{
CTest ct( 10 );
/* 如果构造函数发生异常,处理完异常返回之后,这里没有处理代码,程序一样会当掉
可是真正的异常在构造函数又已经处理过了,那这里应该怎么写?*/
ct.show();
}

...全文
111 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
super_admi 2015-08-17
  • 打赏
  • 举报
回复
1.不建议在构造函数中抛出异常; 2.不建议在类中自己处理异常; 既然你想使用异常来控制,那么: 1.必须在需要处理异常的地方,才处理异常,并且,如果此时尚未结束或者全部处理,那么就应该在catch中添加throw;继续抛出异常;
fefe82 2015-08-17
  • 打赏
  • 举报
回复
把这个异常丢给主函数处理,不要在构造里 catch 。 要不就加一个成员变量,指示初始化是否成功。
Saleayas 2015-08-17
  • 打赏
  • 举报
回复
你的这种异常叫做 function try block,中文叫什么,不知道。 虽然在 catch 里面没有 rethrow 这类的代码,但是,function-try block 会自动再次抛出异常的。 也就是说,构造异常是不可以屏蔽的。 function-try block 仅仅给你提供一个处理构造时异常的处理机会。 比如销毁在异常前已经构造的部分。因为当 异常发生后,是不会呼叫析构函数的。
jiqiang01234 2015-08-17
  • 打赏
  • 举报
回复

#include "test.h"
using TEST::CTest;
 
int main()
{
    std::unique_ptr<CTest> p(new CTest( 10 ));
    if(p)
    {
        p->show();
    }
}

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧