免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wwwsq
打印 上一主题 下一主题

[C++] 有人会在程序中try catch吗? [复制链接]

论坛徽章:
0
51 [报告]
发表于 2008-08-20 19:20 |只看该作者
原帖由 Sam1860 于 2008-8-20 19:18 发表


遗漏是必然的,但总是停留在低级遗漏上确不是


谢谢指正

论坛徽章:
0
52 [报告]
发表于 2008-08-20 19:34 |只看该作者
原帖由 zylthinking 于 2008-8-20 00:11 发表


在catch里面free嘛, 编码小心点还是能做到的

catch里free容易破坏封装性

我觉得try...catch...配合上垃圾回收才叫完整的异常处理

论坛徽章:
0
53 [报告]
发表于 2008-08-20 22:12 |只看该作者
原帖由 reiase 于 2008-8-20 19:34 发表

catch里free容易破坏封装性

我觉得try...catch...配合上垃圾回收才叫完整的异常处理



我觉得你说的不错。

所以有一帮C++的家伙去创造了auto_ptr之类的东西。有消息说C++0x打算在语言级别支持垃圾回收,比如char^ p = new char[100];的这个p可以自动释放。不过目前来看,这些东西只是给C++套上了一堆枷锁。

C++因为本身语言的特性,并不适合exception。Java、C#这样带垃圾回收、内存严格管理的语言,才是exception发挥作用的地方。


PS:其实出于性能的考虑,即使在Java和C#里面,用exception也有很多限制。

论坛徽章:
0
54 [报告]
发表于 2008-08-20 22:25 |只看该作者
C++因为本身语言的特性,并不适合exception。Java、C#这样带垃圾回收、内存严格管理的语言,才是exception发挥作用的地方。非常赞成这样的观点

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
55 [报告]
发表于 2008-08-21 13:40 |只看该作者
原帖由 reiase 于 2008-8-20 19:34 发表

catch里free容易破坏封装性

我觉得try...catch...配合上垃圾回收才叫完整的异常处理


封装一般倾向于高层的封装, 内部我一般很过程 呵呵

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
56 [报告]
发表于 2008-08-21 13:45 |只看该作者
原帖由 wwwsq 于 2008-8-20 10:29 发表




你违反了另一条规则:不要在构造函数里面做太复杂的事情。

坏的代码风格就像多米诺骨牌一样,有了一个坏的风格就会需要另一个坏的风格来弥补。


规则是人定的不是? 我没怎么看过规则的。

try{
    new obj;
}catch(...){}

我用的一个原因就是不想写一个init之类的函数, 没什么那个好坏的, 只是个人喜好.
我感觉

ptr = new obj;
if(-1 == ptr->init()){
     // ....
}
这样的代码也不怎么好看

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
57 [报告]
发表于 2008-08-21 13:55 |只看该作者
算了算了, 发原始代码

这是构造函数:
linklist::linklist(int mode, int job){
    if(mode != 0 && mode != 1 || job == -1){
        throw 47;
    }
    m_mode = mode;
    link_list = (list<item *> *) job;
}


这是调用:
    file_information* info = (file_information *) calloc(sizeof(file_information), 1);
    if(info == 0){
        return -1;
    }

    try{
        new (&info->link) linklist(0, job);
    }catch(int){
        free(info);
        return -1;
    }

说白了就是想把参数校验放到类里面, 又不想多写一个 init 之类的方法以判断参数是否正确
从自己感觉来说, 我这种方法也算是能接受吧

论坛徽章:
0
58 [报告]
发表于 2008-08-21 14:42 |只看该作者
绝对不用

论坛徽章:
0
59 [报告]
发表于 2008-08-21 15:42 |只看该作者
原帖由 wwwsq 于 2008-8-11 17:24 发表


你看到的这家公司,要么是家垃圾公司,要么是家很成功的公司。我想后者的可能性比较大。

C++是很优秀的语言,但是C++大而全,因此C++里面也有很多垃圾特性(或者说不适合你用的语言特性)。用好C++的一个关键就是:不要使用C++里面的垃圾特性。

我知道有家公司大概代码有几百万行,没有模板、没有异常,也几乎没有STL。基本上都是带class的C。代码可维护性很好,以至于他们的维护人员抱怨没多少工作量,在公司里缺乏存在感。


多好!终于看到有公司专门招人擦屁股了。。
不像我们的维护人员,就是写代码的人兼职的。

论坛徽章:
0
60 [报告]
发表于 2008-08-22 16:10 |只看该作者
就让程序死掉?
如果运行的是一个7*24小时服务的程序,这种机制就严重了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP