xt 发帖数: 17532 | 1 我在一个class里面写了一个方法:
class MyException :public std::exception
{
public:
MyException(const int code);
int getCode();
private:
int _code;
}
Class A
{
public:
void doWork() throw(MyException);
...
};
在一个方法里调用:
...
A a;
try {
a.doWork();
}catch(MyException &e) {
cout << "Code=" << e.getCode << endl;
} catch (...) {
cout << "An error occurred" << endl;
}
结果:每次总是落到catch(...)那里面。
谁知道为什么?我用VC的release编译好像有这个问题 |
P***y 发帖数: 2885 | 2 void dowork() throw(MyException&)?
【在 xt 的大作中提到】 : 我在一个class里面写了一个方法: : class MyException :public std::exception : { : public: : MyException(const int code); : int getCode(); : private: : int _code; : } : Class A
|
E*V 发帖数: 17544 | 3 something wrong with your code
check this
#include
#include
class mye :public std::exception{
public:
mye(const int code):_code(code){};
int getCode();
private:
int _code;
};
class A{
public:
void work() throw(mye) {throw mye(1);}
};
int main(){
A a;
try{
a.work();
}
catch (mye &e){
std::cerr << "in\n";
}
catch (...){
}
}
【在 xt 的大作中提到】 : 我在一个class里面写了一个方法: : class MyException :public std::exception : { : public: : MyException(const int code); : int getCode(); : private: : int _code; : } : Class A
|
xt 发帖数: 17532 | 4 奇怪的是debug编译好像没有错,结果release编译就出错了,
把那个exception直接给扔到最上层去,我只好catch(...)
【在 E*V 的大作中提到】 : something wrong with your code : check this : #include : #include : class mye :public std::exception{ : public: : mye(const int code):_code(code){}; : int getCode(); : private: : int _code;
|
B*V 发帖数: 3365 | 5 in my release version this file works as expected
【在 xt 的大作中提到】 : 奇怪的是debug编译好像没有错,结果release编译就出错了, : 把那个exception直接给扔到最上层去,我只好catch(...)
|
B*V 发帖数: 3365 | 6 visual studio ultimate 2010 and 2012
【在 B*V 的大作中提到】 : in my release version this file works as expected
|
xt 发帖数: 17532 | 7 嗯,我再看看我的程序。
对了,我中间其实还经过了一个method:
void A.callWork();
没有定义throw(),是不是这个地方的原因啊?
【在 B*V 的大作中提到】 : in my release version this file works as expected
|
y**b 发帖数: 10166 | 8 没定义怎么抛出
void doWork() throw(MyException); //这个throw只是说明有可能抛出
【在 xt 的大作中提到】 : 嗯,我再看看我的程序。 : 对了,我中间其实还经过了一个method: : void A.callWork(); : 没有定义throw(),是不是这个地方的原因啊?
|
xt 发帖数: 17532 | 9 看来是这个原因,等我回家试验一下。
另外,有没有人用boost?我发现如果我用mutex,lock()
和unlock()之间如果时间间隔太短,也会出错,害得我中间
还要sleep几十毫秒。
【在 y**b 的大作中提到】 : 没定义怎么抛出 : void doWork() throw(MyException); //这个throw只是说明有可能抛出
|
t****t 发帖数: 6806 | 10 没定义说明可以抛出任何东西.
【在 y**b 的大作中提到】 : 没定义怎么抛出 : void doWork() throw(MyException); //这个throw只是说明有可能抛出
|
|
|
t****t 发帖数: 6806 | 11 没有的事...你别处有bug, 不要乱找原因.
【在 xt 的大作中提到】 : 看来是这个原因,等我回家试验一下。 : 另外,有没有人用boost?我发现如果我用mutex,lock() : 和unlock()之间如果时间间隔太短,也会出错,害得我中间 : 还要sleep几十毫秒。
|
d**********x 发帖数: 4083 | 12 zan
【在 t****t 的大作中提到】 : 没有的事...你别处有bug, 不要乱找原因.
|
M*********t 发帖数: 257 | 13 The standard practice for exceptions in C++ is
Throw by value, catch by const reference
First question to you is Did you throw by value?
How did you create the exception object in dowork()
【在 xt 的大作中提到】 : 我在一个class里面写了一个方法: : class MyException :public std::exception : { : public: : MyException(const int code); : int getCode(); : private: : int _code; : } : Class A
|
u****i 发帖数: 1679 | |
b*******s 发帖数: 5216 | 15 throw只是说明预计会抛出的异常,而不在这个范围内的,用户可以安装一个异常处理
的回调函数进行处理,如果没定义过,就是用默认的异常处理,通常是terminate()
【在 y**b 的大作中提到】 : 没定义怎么抛出 : void doWork() throw(MyException); //这个throw只是说明有可能抛出
|
xt 发帖数: 17532 | 16 throw MyException(-1);
【在 M*********t 的大作中提到】 : The standard practice for exceptions in C++ is : Throw by value, catch by const reference : First question to you is Did you throw by value? : How did you create the exception object in dowork()
|
y**b 发帖数: 10166 | 17 如果没有异常说明(exception specification),说明可能抛出任何东西,
如void doWork();
如果异常说明为空,说明不打算抛出任何东西,如woid doWork() throw();
如果异常说明非空,又抛出不同类型的异常,就terminate()了。
他没有定义函数体,抛出什么呢?
【在 t****t 的大作中提到】 : 没定义说明可以抛出任何东西.
|
y**b 发帖数: 10166 | 18 就是这个问题吧?
【在 xt 的大作中提到】 : throw MyException(-1);
|
t****t 发帖数: 6806 | 19 这个完全没有问题. 他的问题在别处.
【在 y**b 的大作中提到】 : 就是这个问题吧?
|
b*******s 发帖数: 5216 | 20 “如果异常说明非空,又抛出不同类型的异常,就terminate()了。”
不完全对
【在 y**b 的大作中提到】 : 如果没有异常说明(exception specification),说明可能抛出任何东西, : 如void doWork(); : 如果异常说明为空,说明不打算抛出任何东西,如woid doWork() throw(); : 如果异常说明非空,又抛出不同类型的异常,就terminate()了。 : 他没有定义函数体,抛出什么呢?
|
|
|
xt 发帖数: 17532 | 21 是这个原因。在函数定义中加了throw之后就好了
【在 y**b 的大作中提到】 : 没定义怎么抛出 : void doWork() throw(MyException); //这个throw只是说明有可能抛出
|
xt 发帖数: 17532 | 22 没有定义就抛出,我的理解是可以用catch(...)处理。这种错误还是
可以处理的错误,不是那种比如直接撞NULL的物理性错误。
【在 y**b 的大作中提到】 : 如果没有异常说明(exception specification),说明可能抛出任何东西, : 如void doWork(); : 如果异常说明为空,说明不打算抛出任何东西,如woid doWork() throw(); : 如果异常说明非空,又抛出不同类型的异常,就terminate()了。 : 他没有定义函数体,抛出什么呢?
|
B*V 发帖数: 3365 | 23 你说的定义应该是声明,不是定义,定义是具体的实现
没有声明,可以抛任何异常,不是catch(...)来处理
catch(...)
就是吃掉所以异常
【在 xt 的大作中提到】 : 没有定义就抛出,我的理解是可以用catch(...)处理。这种错误还是 : 可以处理的错误,不是那种比如直接撞NULL的物理性错误。
|