读书人

c 能否自动throw异常

发布时间: 2014-01-12 00:03:16 作者: rapoo

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 异常类。



读书人网 >C++

热点推荐