标题: 关于C++的异常的问题
xplayer512
新生入学
Rank: 1
注册用户



UID 129696
精华 0
积分 0(积分有什么用?)
帖子 46
阅读权限 10
注册 2005-8-10
状态 离线
发表于 2007-7-18 15:27  资料  个人空间  短消息  加为好友 
关于C++的异常的问题

  我用g++编译的c++程序。不知道在catch里应该是catch(exception e)还是(exception& e)?(《C++完全参考》里用的是普通的参数,ibm网站上的知识库里的程序用的是引用参数)我不知道该用哪个了。5~'{3u.x Q
  还有就是抛出异常时throw SocketException(m_errno);里面带参数就出错?非要这样才行throw SocketException();?而且出错时候居然是语法错误。        ] f5ejD \)K
  请高手们指点一下。

顶部
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 63(积分有什么用?)
帖子 4816
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 在线
发表于 2007-7-18 20:11  资料  个人空间  短消息  加为好友 
如果 throw 出来的 exception 的类型是 E 的话, 应该 catch(E e) 或者 catch(E & e), 举例:

-(dearvoid@LinuxEden:tty3)-(~/void/c++)-
[4013 0] # cat exception.cc
#include <iostream>

using namespace std;

class MyException {
public:
    MyException() {}
    MyException(const string & s) : errMsg(s) {}

    const string & getMsg()
    {
        return errMsg;
    }

    void setMsg(const string & s)
    {
        errMsg = s;
    }

private:
    string errMsg;
};

void throwExecption_1(const string & s)
{
    throw MyException(s);
}

void throwExecption_2(const string & s)
{
    static MyException e;

    e.setMsg(s);
    throw &e;
}

int main()
{
    try {
        throwExecption_1("Oops 1!");
    } catch (MyException & e) {
        cout << e.getMsg() << endl;
    }

    try {
        throwExecption_1("Oops 2!");
    } catch (MyException e) {
        cout << e.getMsg() << endl;
    }

    try {
        throwExecption_2("Oops 3!");
    } catch (MyException * e) {
        cout << e->getMsg() << endl;
    }

    try {
        throwExecption_2("Oops 4!");
    } catch (MyException * & e) {
        cout << e->getMsg() << endl;
    }
}
-(dearvoid@LinuxEden:tty3)-(~/void/c++)-
[4013 0] # g++ -o exception exception.cc
-(dearvoid@LinuxEden:tty3)-(~/void/c++)-
[4013 0] # ./exception
Oops 1!
Oops 2!
Oops 3!
Oops 4!
-(dearvoid@LinuxEden:tty3)-(~/void/c++)-
[4013 0] # o

[ 本帖最后由 dearvoid 于 2007-7-18 20:21 编辑 ]





'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
DarkSpy
版主
Rank: 7Rank: 7Rank: 7
版主


UID 5
精华 4
积分 0(积分有什么用?)
帖子 3325
阅读权限 100
注册 2000-7-30
来自 ConeosBraintel. Matrix
状态 离线
发表于 2007-7-20 12:57  资料  个人空间  主页 短消息  加为好友  ICQ 状态
在不停继续抛出 exception 才能看到区别X
]:Y Kuq6b_P:V

一般的, 为了效率, 不需要使用 exception, 除非大的工程.
&Tp}1@p#GlF,n在抛出的类型为非临时对象的时候,%^ Dl9Z3i7XwXU
使用 (exp e) 会造成两次复制操作,一次操作在抛出的时候,将对象复制一份抛出,第二次在捕获的时候复制.
bG9W3v4K]

使用 (exp& e) 将会造成一次复制操作, 在捕获的时候复制一份Linux伊甸园论坛$_5mz9?n'A\
F

使用 (exp* e) 不会造成复制操作.4Ov9lD"f0q?        K
为了效率考虑,使用异常最好使用指针抛出,但是记得要删除,实在不行,最好是引用类型.





-----------------------------------------
耶稣说:「谁若知道世界,便是发现了一具躯壳;谁若发现了一具躯壳,对那人来说,世界不值得甚麼。」
              ----(圣经次经: 多玛福音:56)
顶部
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 63(积分有什么用?)
帖子 4816
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 在线
发表于 2007-7-20 15:11  资料  个人空间  短消息  加为好友 
To make it clear:

-(dearvoid@LinuxEden:tty3)-(~/void/c++)-
[8366 0] # cat exception.cc
#include <iostream>

using namespace std;

class MyException {
public:
    MyException()
    {
        cout << ".. now in default constructor" << endl;
        cout << ".. address: " << this << endl;
    }

    MyException(const string & s) : errMsg(s)
    {
        cout << ".. now in constructor from string" << endl;
        cout << ".. address: " << this << endl;
    }

    MyException(const MyException & e)
    {
        cout << ".. now in copy constructor" << endl;
        cout << ".. address: " << this << " <--- " << &e << endl;
        errMsg = e.errMsg;
    }

    MyException & operator =(const MyException & e)
    {
        cout << ".. now in = operator" << endl;
        errMsg = e.errMsg;
        return *this;
    }

    const string & getMsg()
    {
        return errMsg;
    }

    void setMsg(const string & s)
    {
        errMsg = s;
    }

private:
    string errMsg;
};

// the `throw' declaration is optional
void throwExecption_1(const string & s) throw(MyException)
{
    MyException e(s);
    throw e;
}

void throwExecption_2(const string & s) throw(MyException *)
{
    static MyException e;

    e.setMsg(s);
    throw &e;
}

int main()
{
    cout << ".. catch (E & e)" << endl;
    try {
        throwExecption_1("Oops 1!");
    } catch (MyException & e) {
        cout << ".. address: " << &e << " (caught)" << endl;
        cout << e.getMsg() << endl;
    }

    cout << "--------" << endl;
    cout << ".. catch (E e)" << endl;
    try {
        throwExecption_1("Oops 2!");
    } catch (MyException e) {
        cout << ".. address: " << &e << " (caught)" << endl;
        cout << e.getMsg() << endl;
    }

    cout << "--------" << endl;
    cout << ".. catch (E * e)" << endl;
    try {
        throwExecption_2("Oops 3!");
    } catch (MyException * e) {
        cout << e->getMsg() << endl;
    }

    cout << "--------" << endl;
    cout << ".. catch (E * & e)" << endl;
    try {
        throwExecption_2("Oops 4!");
    } catch (MyException * & e) {
        cout << e->getMsg() << endl;
    }
}
-(dearvoid@LinuxEden:tty3)-(~/void/c++)-
[8366 0] # g++ -o exception exception.cc
-(dearvoid@LinuxEden:tty3)-(~/void/c++)-
[8366 0] # ./exception
.. catch (E & e)
.. now in constructor from string
.. address: 0xbfa7a92c
.. now in copy constructor
.. address: 0x804b070 <--- 0xbfa7a92c
.. address: 0x804b070 (caught)
Oops 1!
--------
.. catch (E e)
.. now in constructor from string
.. address: 0xbfa7a92c
.. now in copy constructor
.. address: 0x804b070 <--- 0xbfa7a92c
.. now in copy constructor
.. address: 0xbfa7a97c <--- 0x804b070
.. address: 0xbfa7a97c (caught)
Oops 2!
--------
.. catch (E * e)
.. now in default constructor
.. address: 0x804ae48
Oops 3!
--------
.. catch (E * & e)
Oops 4!
-(dearvoid@LinuxEden:tty3)-(~/void/c++)-
[8366 0] #






'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
不容错过的IBM 集群技术资源汇总
 



当前时区 GMT+8, 现在时间是 2008-5-17 10:58

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.068813 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP