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

c 能否自动throw异常

2014-01-12 
c能否自动throw错误用过python异常处理的人都知道,try块发生错误可以自动引发,不须要if...throw,我不关心

c 能否自动throw错误
用过python异常处理的人都知道,try块发生错误可以自动引发,不须要if...throw,我不关心错误类型,不需要我去判断错误发生的条件,所有错误交由catch (...)处理,我试了下,不手动throw,catch是不理的。
[解决办法]
python程序是在python环境中运行,出现异常时环境会抛出异常.
c++程序是直接在OS上运行, 出现异常时OS不会抛出异常.

[解决办法]
所有C++ try block后面catch到的exception都必须有对应的throw, 没有throw, 就没东西可catch。所以像divide by zero, access violation都是catch不到的,不管你try的多么hard :)

但是在try块里检测错误并throw是错误的做法,应该是try块里调用的函数(包括成员函数)有责任检测异常并适当地throw。

例子, 错误的做法


class MyVeryLargeNumber{
public:
    MyVeryLargeNumber& /=(int rhs)
    {
         // do the actual calculation
         return *this;
    }
};

int main()
{
    int m;
    MyVeryLargeNumber n;
    
    // init n, m, etc
    try{
       if(m==0)
           throw "divide by zero!";
       n/=m;
    }catch(...){
       // do something
    }
}


正确的做法:
[code]
class MyVeryLargeNumber{
public:
    MyVeryLargeNumber& /=(int rhs)
    {
         if(rhs==0)
             throw "divide by zero!";
         // do the actual calculation
         return *this;
    }
};

int main()
{
    int m;
    MyVeryLargeNumber n;
    
    // init n, m, etc
    try{
       n/=m;
    }catch(...){
       // do something
    }
}
[/code]

C++的标准库里面有很多类似上面的处理,这样你在使用它们时就可以try{}catch(){}
比如:

#include <iostream>
#include <vector>

int main()
{
    using namespace std;
    vector<int> vi;
    try
    {
       cout << vi.at(0) <<endl;
    }
    catch (out_of_range&)
    {
        cerr << "no element at the location yet.\n";
    }
}

[解决办法]
C++库代码,也可以直接抛出某些异常;不过需要设置一下而已。
有些异常,可以通过代码,设置抛出异常,或者不抛出异常。
当然库代码本身,可能会有throw 代码。
因为C++ 一般抛出C++异常类;
而不是 硬件异常,或者C的结构化异常。

C++,通过处理结构化异常,把对应的硬件异常,其他C异常,转换为C++异常类抛出。
也可以不抛出任何异常。
C++通过 try ... catch 捕捉异常,使代码从异常中,恢复过来,从而可以正常运行。
如果有任何异常,没有被捕捉,则会一直传播,直到被捕捉,或者程序结束运行。

如果你的代码,主动throw的话,你可以throw任何类型数据;
比如整型数10,字符串“12345”,但是一般都throw 异常类。



热点排行