返回信息流处理方式如下几种:
1、如果函数设计时有返回值,主函数中检查返回值以判断是否出错,这是linux c函数中常用方式,大量API返回int型,一般如果返回0表示成功,返回-1表示失败
2、函数内部出错时设置全局变量,在主函数中检查全局变量以判断是否出错,这也是linux c函数的常用方式,比如很多API会设置errno值
3、只要函数出错,就exit或者abort
4、加入异常处理,主要用在c++中
我主要没搞清楚这些方式的适用场景,求大牛赐教!
这是一条镜像帖。来源:北邮人论坛 / cpp / #87830同步于 2015/7/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
如果函数出错,有以下几种处理方式,该怎么判别用哪种?
betough
2015/7/9镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
类似的讨论很多,lz多搜一下:
http://stackoverflow.com/questions/99683/which-and-why-do-you-prefer-exceptions-or-return-codes
https://www.google.com.hk/search?q=exception+vs+return+code&ie=utf-8&oe=utf-8&gws_rd=cr,ssl
C语言请用第一种。
第二种:线程不安全。如果两个线程调用同一个函数,而它们共用了那个全局变量,就冲突了。事实上errno不是真的global,而是thread local的。
第三种:你不知道你的函数是一个独立的程序呢,还是另一个大的系统的一个模块。一exit整个进程就死了,没有任何处理的机会。
第四种:C++的异常处理很烂,如果异常被抛出,而没有任何catch,那么程序会立即终止,连栈上的对象的析构函数都不会执行。(Java里finally是一定会执行的)而且C++的异常还有ABI问题(二进制兼容性),还有微软的专利问题。
其实还有第五种处理方法:setjmp和longjmp,和异常处理类似,也是非局部的跳转,但是是手动控制流程。Lua是这样实现异常处理的。
Java的话,请视“异常情况”出现的几率,考虑用第一种或者第四种。比如,如果一个集合里寻找元素,如果元素有很大的概率是不存在的,那么就请返回特殊值而不是抛出异常,因为如果50%的概率都找不着,那么“找不着”就不叫“异常”了。异常是很少发生的事。
1、一般返回0表示成功,失败情况下返回-1、整数都比较常见的;
2、在多线程环境下,errno并不是整数类型全局变量;并不是“检查全局变量以判断是否出错”,而是已知出错了,根据errno之类的来判断“出什么错”了;
【 在 betough 的大作中提到: 】
: 处理方式如下几种:
: 1、如果函数设计时有返回值,主函数中检查返回值以判断是否出错,这是linux c函数中常用方式,大量API返回int型,一般如果返回0表示成功,返回-1表示失败
: 2、函数内部出错时设置全局变量,在主函数中检查全局变量以判断是否出错,这也是linux c函数的常用方式,比如很多API会设置errno值
: ...................
【 在 wks 的大作中提到: 】
: C语言请用第一种。
: 第二种:线程不安全。如果两个线程调用同一个函数,而它们共用了那个全局变量,就冲突了。事实上errno不是真的global,而是thread local的。
: 第三种:你不知道你的函数是一个独立的程序呢,还是另一个大的系统的一个模块。一exit整个进程就死了,没有任何处理的机会。
: ...................
受教了