【发布时间】:2014-08-28 18:12:57
【问题描述】:
很多时候,我必须使用多个以不同方式处理错误的库,或者为错误定义自己的枚举。这使得编写可能必须处理来自不同来源的错误然后返回自己的错误代码的函数变得困难。例如:
int do_foo_and_bar()
{
int err;
if ((err = libfoo_do_something()) < 0) {
// return err and indication that it was caused by foo
}
if ((err = libbar_do_something()) < 0) {
// return err and indication that it was caused by bar
}
// ...
return 0;
}
我想到了两种可能的解决方案:
- 使用
int translate_foo_error(int err)之类的函数创建我自己的错误代码列表并将这些错误代码转换为新代码,然后我将为每个错误编写自己的字符串表示形式。 - 创建一个
struct my_error,其中包含一个标识库的枚举和错误代码。字符串的翻译将委托给每个库的适当函数。
这似乎是一个经常出现的问题,所以我很好奇,这通常是如何处理的?似乎前者是大多数图书馆所做的,但后者的工作量较少,并且可以使用已经提供的工具。大多数教程只是向 stderr 打印一条消息并在出现任何错误时退出,这无济于事。我宁愿让每个函数指出哪里出了问题,调用者可以据此决定如何处理。
【问题讨论】:
-
您还必须注意那些与惯例相反的情况:1 表示成功,0 表示失败,然后您需要调用另一个例程来找出失败的原因。每个函数都有一个错误是一个不错的选择,但是当库中有添加时会发生什么 - 您是在底部添加它还是将其他所有内容向下移动或为每个库分配代码块。每种技术都有自己的问题。
标签: c error-handling libraries custom-error-handling