首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

抛出错误、捕获的有关问题

2013-11-11 
抛出异常、捕获的问题C++里发生错误会抛出异常,某些异常的默认处理方式是terminate程序。我一直使用c做开发,

抛出异常、捕获的问题
C++里发生错误会抛出异常,某些异常的默认处理方式是terminate程序。
我一直使用c做开发,函数调用是否成功几乎全靠返回值,外加一些相关数据(例如errno),从没想过要捕获异常!现在为了简化开发工作量,要使用容器list,其他代码仍然是c的,比如malloc。所以要将.c硬生生改成.cpp的。

问题是:.cpp的文件使用malloc,如果失败,会不会像new那样抛出异常然后terminate?

目前个人认为,C++虽然提供了一些类来完成工作,降低了开发工作量,但是我更喜欢c那种单纯的语言,对每一个函数都做出严谨的判断,而C++会抛出各种恶心的异常,我写一段代码,哪里会知道有啥异常啊,有一种捕风捉影的感觉。

大伙儿说说,你们对try catch的理解,怎么适应从c到C++的过渡? C/C++ 异常捕获 terminate
[解决办法]
cpp的文件使用malloc,如果失败, 不会像new那样抛出异常
[解决办法]
cpp的文件使用malloc,如果失败, 不会像new那样抛出异常
[解决办法]
std::list 那里扔异常,标准有规定的。要是懒得看标准,可以看看 cplusplus.com。
malloc 不会抛异常的,需要检查返回值。
[解决办法]
new也可能不throw:
new (std:;nothrow) ClassA()
[解决办法]
C++的异常也不恶心吧,你以前既然可以用C处理这些问题,就应该知道会有哪些异常啊,哪有什么捕风捉影的?
malloc的话不会抛异常的,要你自己来判断的。new的话也未必一定会抛异常,看你怎么做了。

举个简单的例子吧,比如:

#include <iostream>

double Div(double x,double y)
{
    if(y==0)
        throw y;//抛出异常
    return x/y;
}

int main()
{
    double x=5.5,y=0.0;
    try
    {

        std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;
    }
    catch(double)
    {
        std::cout<<"除数为0.0,计算错误!"<<std::endl;
    }
    return0;
}
和之前一样的,只是用if判断以后,改成了throw,然后到调用的地方进行处理而已。没有你说的捕风捉影吧。
[解决办法]
异常的话能少用还是少用吧,主要还是靠返回值然后判断什么的,监听会占用系统资源的。异常处理要看命中率的,如果异常命中率很高,那么效率肯定不如if-else好,如果命中率很低,几乎不触发catch,那么会比if-else要好很多。
[解决办法]
Windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

Linux:
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core或core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令

热点排行