关于高可靠性编程,讨论下我在做一个程序,其对可靠性稳定性要求很高。因为其部署后可能连续不断地长时间运行
关于高可靠性编程,讨论下
我在做一个程序,其对可靠性稳定性要求很高。因为其部署后可能连续不断地长时间运行。
我为了提高可靠性,于是检查每一个调用的返回值,每一个函数都做成返回int类型,检查每一个入口参数,等等
结果是,这个程序的代码风格让我很别扭!
随便抽取其中一个,其大致形如:
C/C++ codeif (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 是多么亲切了。
有什么好的办法来构建高可靠性程序吗?
有什么编码原则?
有什么内存管理原则?
有什么控制流设计原则?
求教!
[解决办法]看这个系列 文章:
http://blog.csdn.net/all528/archive/2004/10/14/137060.aspx
[解决办法]在一个头文件里,定义一下宏,来指明错误值
然后
#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;} }
[解决办法]这种情况最好用goto语句
[解决办法] 那就swich case乐,呵呵!
[解决办法]-_-!
不用这样吧,确保调用函数不会出错就行
我一般写程序只由调用者负责参数是正确的,被调用者无需负责
[解决办法]个人感觉goto可能比较好
因为在Linux内核中的goto语句就是为了实现高可靠性的,Linux内核中goto语句用的很多
[解决办法]恩 太麻烦了
我个人觉得用try ... catch...好
[解决办法][解决办法]高可靠性的程序...C/C++不适合,用Ada才好...
[解决办法]MARK.
[解决办法]下面是我自己再写纯C程序的一些原则, 给你参考下:
- 所有的struct都要有signature字段,以便校验.
- 不用的指针立刻释放.释放后立刻给值NULL.可以写一个宏来做这个事情.
- 大量使用assert,以便再debug的时候就发现潜在的问题.
- 所有的变量都要有初始值
- 每个函数再真正开始工作之前,先检查参数的合法性
- 警惕NULL参数
- 不使用可变参数函数
[解决办法]高可靠性不是这样弄出来的。
最简单的例子,Apache 的 Prefork 和 Worker 模型都允许一个工作单元(线程或进程)在处理一定数量的 request 之后结束重新启动。真正一直运行的进程是很少有工作量的,只负责监管其它工作单元状态。系统里最可靠的是谁?肯定是 OS 自己了,所以,还是依赖 OS 吧。
[解决办法]do{
if (aaa() == AAA_ERROR)
{
break;
}
if (bbb() == BBB_ERROR)
{
break;
}
if (ccc() == CCC_ERROR)
{
close_handle(...);
break;
}
if (ddd() == DDD_ERROR)
{
close_handle(...);
break;
}
if (eee() == EEE_ERROR)
{
fclose(...);
close_handle(...);
break;
}
if (fff() == FFF_ERROR)
{
fclose(...);
close_handle(...);
break;
}
return XXX_NOERROR;
}while(false)
close_handle(...);
return XXX_ERROR;
------解决方案--------------------
ADA也可以编windows服务,如果他不知道,那是他小白
[解决办法][解决办法]1.goto语句,如果你在C编程里,不是完全否定goto,而是不要有太多出口,这样会混淆逻辑的。
2.try catch在C++中
3.用宏对做个wrap,在C中
#define CHECK_EXPRESSION(x) if(x== FALSE) return E_RROR;