【发布时间】:2013-06-27 11:45:13
【问题描述】:
在不支持异常的语言和/或库中,许多/几乎所有函数都返回一个值,指示其操作成功或失败 - 最著名的例子可能是 UN*X 系统调用,例如 open() 或 @ 987654323@,或者一些libc函数。
不管怎样,当我写 C 代码时,它经常看起来像这样:
int retval;
...
retval = my_function(arg1, arg2);
if (retval != SUCCESS_VALUE) { do_something(); }
retval = my_other_function(arg1, arg2);
if (retval != SUCCESS_VALUE) { do_something_else(); }
现在,我想要的是不要在任何地方保存 retval 并且在异常中抛出错误,但我不能这样做。下一个最好的事情是什么?我知道there's no real solution to this problem,但我仍然想做一些事情。
一些想法:
- 尝试与
assert()共存(但这不适用于不能直接死掉的生产代码)。 - 使用宏或返回值检查函数包装函数调用,例如
ensure_success(my_function(args)或ensure_success(my_other_function(args),my_error_handler,error_handler_args)。
在这件事上我可能更喜欢其他的做法吗?
编辑:
- 是的,我正在编写 C 代码。我尊重您的意见,即我应该尽量避免完全用 C 语言编写,但这确实没有建设性。这不是一个语言战争问题,请不要成为一个问题。
- 我不是在征求关于什么是最好的做法的意见,我只是想要更多的可能性。 (我会选择我喜欢的,其他人可能会选择其他的。)
【问题讨论】:
-
@sbi 是的,我想我们都同意 C 有“问题”:)
-
同时,没有人加入我的明智投票,以主要基于意见(在语言战争之前)结束这一决定。
-
在没有异常处理的语言中,这几乎是您必须做的,以免错过错误。
-
@JimBalter 我现在做到了。
-
assert不用于错误处理
标签: c error-handling return-value conventions