BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #87830同步于 2015/7/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

如果函数出错,有以下几种处理方式,该怎么判别用哪种?

betough
2015/7/9镜像同步4 回复
处理方式如下几种: 1、如果函数设计时有返回值,主函数中检查返回值以判断是否出错,这是linux c函数中常用方式,大量API返回int型,一般如果返回0表示成功,返回-1表示失败 2、函数内部出错时设置全局变量,在主函数中检查全局变量以判断是否出错,这也是linux c函数的常用方式,比如很多API会设置errno值 3、只要函数出错,就exit或者abort 4、加入异常处理,主要用在c++中 我主要没搞清楚这些方式的适用场景,求大牛赐教!
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
iFadeToBlack机器人#1 · 2015/7/9
类似的讨论很多,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
wks机器人#2 · 2015/7/9
C语言请用第一种。 第二种:线程不安全。如果两个线程调用同一个函数,而它们共用了那个全局变量,就冲突了。事实上errno不是真的global,而是thread local的。 第三种:你不知道你的函数是一个独立的程序呢,还是另一个大的系统的一个模块。一exit整个进程就死了,没有任何处理的机会。 第四种:C++的异常处理很烂,如果异常被抛出,而没有任何catch,那么程序会立即终止,连栈上的对象的析构函数都不会执行。(Java里finally是一定会执行的)而且C++的异常还有ABI问题(二进制兼容性),还有微软的专利问题。 其实还有第五种处理方法:setjmp和longjmp,和异常处理类似,也是非局部的跳转,但是是手动控制流程。Lua是这样实现异常处理的。 Java的话,请视“异常情况”出现的几率,考虑用第一种或者第四种。比如,如果一个集合里寻找元素,如果元素有很大的概率是不存在的,那么就请返回特殊值而不是抛出异常,因为如果50%的概率都找不着,那么“找不着”就不叫“异常”了。异常是很少发生的事。
BTup机器人#3 · 2015/7/9
1、一般返回0表示成功,失败情况下返回-1、整数都比较常见的; 2、在多线程环境下,errno并不是整数类型全局变量;并不是“检查全局变量以判断是否出错”,而是已知出错了,根据errno之类的来判断“出什么错”了; 【 在 betough 的大作中提到: 】 : 处理方式如下几种: : 1、如果函数设计时有返回值,主函数中检查返回值以判断是否出错,这是linux c函数中常用方式,大量API返回int型,一般如果返回0表示成功,返回-1表示失败 : 2、函数内部出错时设置全局变量,在主函数中检查全局变量以判断是否出错,这也是linux c函数的常用方式,比如很多API会设置errno值 : ...................
zx723机器人#4 · 2015/7/10
【 在 wks 的大作中提到: 】 : C语言请用第一种。 : 第二种:线程不安全。如果两个线程调用同一个函数,而它们共用了那个全局变量,就冲突了。事实上errno不是真的global,而是thread local的。 : 第三种:你不知道你的函数是一个独立的程序呢,还是另一个大的系统的一个模块。一exit整个进程就死了,没有任何处理的机会。 : ................... 受教了