首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于高可靠性编程,讨论下 [已结贴,结贴人:Keyser]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-05-13 16:01:27 楼主
    我在做一个程序,其对可靠性稳定性要求很高。因为其部署后可能连续不断地长时间运行。

    我为了提高可靠性,于是检查每一个调用的返回值,每一个函数都做成返回int类型,检查每一个入口参数,等等

    结果是,这个程序的代码风格让我很别扭!

    随便抽取其中一个,其大致形如:

    C/C++ code
    if (aaa() == AAA_ERROR) { return XXX_ERROR; } if (bbb() == BBB_ERROR) { return XXX_ERROR; } if (ccc() == CCC_ERROR) { close_handle(...); return XXX_ERROR; } if (ddd() == DDD_ERROR) { close_handle(...); return XXX_ERROR; } if (eee() == EEE_ERROR) { fclose(...); close_handle(...); return XXX_ERROR; } if (fff() == FFF_ERROR) { fclose(...); close_handle(...); return XXX_ERROR; }


    几乎每一个函数都是这个样子。

    突然发现 try catch throw 是多么亲切了。

    有什么好的办法来构建高可靠性程序吗?
    有什么编码原则?
    有什么内存管理原则?
    有什么控制流设计原则?


    求教!
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bubu8633
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 16:05:331楼 得分:2
    看这个系列 文章:
    http://blog.csdn.net/all528/archive/2004/10/14/137060.aspx
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ouyh12345
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-05-13 16:22:422楼 得分:2
    在一个头文件里,定义一下宏,来指明错误值
    然后
    #define RETURN_FOR_ERR(ret) {if (ret != XXX_OK) return ret;}
    #define RETURN_AND_CLOSE(ret,handle) {if (ret != XXX_OK) {CloseHandle(handle); return ret;} }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 16:28:043楼 得分:0
    引用 1 楼 bubu8633 的回复:
    看这个系列 文章:
    http://blog.csdn.net/all528/archive/2004/10/14/137060.aspx


    正在看!但我编的是纯C呀,似乎异常和我没关系……
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 16:29:484楼 得分:0
    引用 3 楼 Keyser 的回复:
    引用 1 楼 bubu8633 的回复:
    看这个系列 文章: 
    http://blog.csdn.net/all528/archive/2004/10/14/137060.aspx


    正在看!但我编的是纯C呀,似乎异常和我没关系……


    读到下面了,很有意思哈哈,谢谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 16:31:335楼 得分:0
    引用 2 楼 ouyh12345 的回复:
    在一个头文件里,定义一下宏,来指明错误值
    然后
    #define RETURN_FOR_ERR(ret) {if (ret != XXX_OK) return ret;}
    #define RETURN_AND_CLOSE(ret,handle) {if (ret != XXX_OK) {CloseHandle(handle); return ret;} }


    谢谢!以前考虑过这种用法,但是难以定义出一致的宏,而且考虑到太多的宏也会导致问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oo
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 16:32:456楼 得分:2
    这种情况最好用goto语句
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • na_he
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 16:40:227楼 得分:2
    那就swich case乐,呵呵!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 16:48:348楼 得分:0
    引用 1 楼 bubu8633 的回复:
    看这个系列 文章:
    http://blog.csdn.net/all528/archive/2004/10/14/137060.aspx


    看完了。主要还是C++的东西。我用不上啊!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 16:51:269楼 得分:0
    引用 6 楼 oo 的回复:
    这种情况最好用goto语句


    所有的出错情况统一 goto 到结束的地方?

    C/C++ code
    if (aaa() == AAA_ERROR) { goto err; } if (bbb() == BBB_ERROR) { goto err; } if (ccc() == CCC_ERROR) { goto err; } if (ddd() == DDD_ERROR) { goto err; } if (eee() == EEE_ERROR) { goto err; } if (fff() == FFF_ERROR) { goto err; } err: fclose(...); close_handle(...); return XXX_ERROR;


    这样?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bubu8633
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 16:56:1510楼 得分:0
    也可以所有的出错 发往统一的端口,在这个端口上开一个线程监听之,处理
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kingstarer
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 16:58:2711楼 得分:1
    -_-!

    不用这样吧,确保调用函数不会出错就行

    我一般写程序只由调用者负责参数是正确的,被调用者无需负责
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cugbliang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 16:58:5612楼 得分:1
    个人感觉goto可能比较好
    因为在Linux内核中的goto语句就是为了实现高可靠性的,Linux内核中goto语句用的很多
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oo
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 17:06:5213楼 得分:0
    引用 9 楼 Keyser 的回复:
    引用 6 楼 oo 的回复:
    这种情况最好用goto语句


    所有的出错情况统一 goto 到结束的地方?


    C/C++ code
    if (aaa() == AAA_ERROR)
    {
        goto err;
    }

    ...

    是的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bubu8633
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 17:07:1014楼 得分:0
    引用 8 楼 Keyser 的回复:
    引用 1 楼 bubu8633 的回复:
    看这个系列 文章: 
    http://blog.csdn.net/all528/archive/2004/10/14/137060.aspx


    看完了。主要还是C++的东西。我用不上啊!


    这里面有句话说地很好:
    “身为 C/C++ 程序员,必须有创造力。那种躺在语言机制上不思进取的人,那种必须要靠语法强制才知道怎样编程的人,那种没有别人告诉他该干什么就无所适从的人,不适合这门语言。”
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bubu8633
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 17:09:5215楼 得分:0
    lz你刚开始的程序肯定不稳定,建议先把日志机制建立起来,这样好查错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oo
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 17:11:3016楼 得分:0
    如果想再好看点,可以搞一个宏,比如
    #define CHECK_RESULT(result, goto_label) do {if(result==EEE_ERROR) goto goto_label;} while(0)

    然后用的时候:
    result = aaa();
    CHECK_RESULT(result,err);

    result = bbb();
    CHECK_RESULT(result,err);

    ...


    err:
      ...

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oo
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 17:14:0317楼 得分:0
    其实goto是个好东西,看你怎么用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • txwcan999
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 18:14:0318楼 得分:1
    恩 太麻烦了
    我个人觉得用try ... catch...好
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 08:59:0319楼 得分:0
    C语言诶,没有try catch。

    我的程序有个特麻烦的事,assert宏使不了。 - -
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 09:01:5720楼 得分:0
    引用 15 楼 bubu8633 的回复:
    lz你刚开始的程序肯定不稳定,建议先把日志机制建立起来,这样好查错


    有哇!我一开始就写了个日志库。可是日志库也同样存在这个问题啊!我想问有关设计理念的问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 09:05:2721楼 得分:0
    引用 11 楼 kingstarer 的回复:
    -_-!

    不用这样吧,确保调用函数不会出错就行

    我一般写程序只由调用者负责参数是正确的,被调用者无需负责


    一般来说是这样的,可是问题就在于保证不了的情况。就像编一个standard library似的,你不能假设调用方怎么怎么样,必须自己强大起来!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • michney
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 09:46:3722楼 得分:1
    引用 19 楼 Keyser 的回复:
    C语言诶,没有try catch。

    我的程序有个特麻烦的事,assert宏使不了。 - -

    高可靠性程序跟选择cc++无关
    Linux纯C加汇编,稳定的不得了

    lz看一下一本书:微软C编程精粹
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 09:52:0423楼 得分:1
    高可靠性的程序...C/C++不适合,用Ada才好...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ciitc2004
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 11:45:2924楼 得分:0
    该回复于2008-05-14 17:18:55被管理员删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 17:14:5425楼 得分:0
    我写的一个函数:

    C/C++ code
    int log_oid(AsnObjectIdentifier *oid) { unsigned int oidIdx; if (oid == NULL) { return LOG_FAIL; } if (log_char('[') != LOG_SUCCESS) { return LOG_FAIL; } for (oidIdx = 0; oidIdx < oid->idLength; ++oidIdx) { if (log_char('.') != LOG_SUCCESS) { return LOG_FAIL; } if (log_unsigned_int(oid->ids[oidIdx]) != LOG_SUCCESS) { return LOG_FAIL; } } if (log_char(']') != LOG_SUCCESS) { return LOG_FAIL; } return LOG_SUCCESS; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 17:15:3426楼 得分:0
    引用 15 楼 bubu8633 的回复:
    lz你刚开始的程序肯定不稳定,建议先把日志机制建立起来,这样好查错


    建好了早就,log_xxx一组函数,但是调用时面临一样的问题啊!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Keyser
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 17:27:0727楼 得分:0
    引用 23 楼 fetag 的回复:
    高可靠性的程序...C/C++不适合,用Ada才好...


    Ada能做Windows服务吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jeff_nie
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-14 21:17:0428楼 得分:1
    MARK.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友