【发布时间】:2017-10-02 15:52:25
【问题描述】:
C 中的嵌套错误处理是否有一些众所周知的模式/实践,例如 Java 中的嵌套异常?
通常的“只返回错误代码/成功”错误详细信息可能会在程序确定它应该记录/报告错误之前丢失。
想象一个类似这样的代码:
err B()
{
if (read(a/b/c/U.user) != OK) {
return read_error; //which would be eaccess or we could return even e_cannot_read_user
}
if (is_empty(read_user.name)) {
// we could tell exactly what is missing here
return einval;
}
...
}
err A()
{
if (B() != OK) {
if (cannot_handle_B_failing()) {
return e_could_not_do_b;
}
}
...
}
main()
{
...
if (A() != OK) && (no_alternative_solution()) {
report error_returned_by_A;
wait_for_more_user_input();
}
}
有没有人在这种情况下成功地尝试过在 C 中使用某种嵌套的错误代码/消息?可以报告(主要)用户名丢失或由于权限无效而无法读取文件 F 的事实。
是否有支持此类功能的库?
【问题讨论】:
-
我见过的一种方法 - 您使用 32 位 int 报告错误 - 但将其拆分为范围,低 16 位是错误代码 - 由较低层函数设置,接下来的 8 位保留用于中间层函数和最高 8 位保留供顶层函数使用。然后从 B 收到的错误是 |= 在带有附加信息的 A 中
-
简短的回答是否定的。 C 是编程语言的白板。很少有广泛使用的习惯用法来实现大型语言中的标准特性:容器、异常、泛型等。(已经给出的答案的多样性是某种证明。)在 Java 异常子系统中,您会收到一个链表的原因。在 C 中,您当然可以自己编写:返回指向原因结构链的指针,而不是整数错误代码。如果你想要类似异常的行为,你可以使用
setjmp和longjmp来拼凑它,而不会有太多麻烦。 -
我知道 C 语言是“发明你自己的轮子”的语言。当然,您可以自己编写“原因列表”,但您还必须在处理错误时清理任何动态分配的跟踪元素,这当然是可行的(例如,保留一些内部分配器并重用“原因”或在新的时候清理它们错误是“创建”)。想知道是否有一个库可以比几个小时内编写的解决方案更好地解决这个问题,这是非常重要的......
-
感谢所有响应者的输入。考虑到答案,结论是没有明确的最佳方法来处理错误,需要逐案决定。
-
@dbrank0,在编码 C 20 年后遇到这个问题(我不是很聪明,第一年我认为我什至没有看到这个问题)我遇到了一些我的项目中的一种平衡,因为这个“确定失败的原因”:永远不会好,永远不会糟糕。我的意思是我像你说的那样逐个查看它,并得出一些可行的方法,它永远不会完全适合,但总是“好吧,这看起来有点尴尬,但它会足够公平".也许有人会找到一个很好的方法来做到这一点。或者不。
标签: c error-handling