C 允许错误消息冒泡
通用条款(gcc)4.7.2 c89 我一直在想,当从调用的函数返回错误消息时,最好的做法是什么 在我正在创建的一个共享库中,我具有以下功能:C 允许错误消息冒泡,c,error-handling,C,Error Handling,通用条款(gcc)4.7.2 c89 我一直在想,当从调用的函数返回错误消息时,最好的做法是什么 在我正在创建的一个共享库中,我具有以下功能: /* Create directory structure */ apr_status_t dir_create(apr_pool_t *mem_pool) { #define SRC "test_src" apr_fileperms_t file_perms = APR_FPROT_UWRITE | APR
/* Create directory structure */
apr_status_t dir_create(apr_pool_t *mem_pool)
{
#define SRC "test_src"
apr_fileperms_t file_perms =
APR_FPROT_UWRITE |
APR_FPROT_GWRITE |
APR_FPROT_WWRITE |
APR_FPROT_UREAD |
APR_FPROT_GREAD |
APR_FPROT_WREAD |
APR_FPROT_UEXECUTE |
APR_FPROT_GEXECUTE;
if(apr_dir_make(SRC, file_perms, mem_pool) != APR_SUCCESS) {
LOG_CRIT("Failed to create directory");
return FALSE;
}
return TRUE;
}
LOG\u CRIT
将显示与错误号相关的相应错误消息
在调用此函数的应用程序中,我有:
if(dir_create(mem_pool) != TRUE) {
return 1;
}
LOG_INFO("Directory has been created");
例如,当上述操作失败时,它将按如下方式记录:
[CRITICAL] dir_create:28: error [File exists] Failed to create directory
我想知道是否应该将错误消息放在调用库函数的应用程序中。或者,您是否应该在最早收到错误消息后立即显示它
在上述情况下,我在被调用函数中显示错误消息。当函数返回时,我只返回1以结束应用程序或执行其他操作
另一种想法是,最好返回错误指示器,并让调用函数显示错误的来源?我建议以尽可能低的级别记录错误消息,就像您在这里所做的那样。如果您需要访问
errno
,这一点尤其重要,否则当您访问更高级别的函数时,可能会发生更改。在这个级别上,我会尽可能地使错误消息技术化和具体化
根据库函数的返回值,应用程序代码可能会执行某些操作(例如,它可能会显示一个弹出窗口,提供对错误的可读描述,或者可以写入
stderr
)。这通常是在尽可能高的级别上完成的——UI级别,如果您愿意的话。我建议在尽可能低的级别上记录错误消息,就像您在这里所做的那样。如果您需要访问errno
,这一点尤其重要,否则当您访问更高级别的函数时,可能会发生更改。在这个级别上,我会尽可能地使错误消息技术化和具体化
根据库函数的返回值,应用程序代码可能会执行某些操作(例如,它可能会显示一个弹出窗口,提供对错误的可读描述,或者可以写入
stderr
)。这通常是在尽可能高的级别上完成的——UI级别,如果你愿意的话。一些选项越来越疯狂——你可能有一种本能,知道什么适合你的情况-P这更能激发您的选择意识:
- 捕获您认为合理的内容—
,\uuuuuuu文件
,\uuuuu行
,错误描述,正在尝试的操作,参数,结果等-在线检测错误错误号
- 原则:只做来电者希望你做的事;许多方法都有不同的折衷:
- 返回一个小的、易于测试的数据值(数字或指针),但提供一些访问函数来轻松获取上面捕获的其他信息,以便“返回到”的代码可以执行它们喜欢的任何操作。。。
- e、 g.调用者可以取消引用该指针以获取错误详细信息,
-类似函数,调用者给了一个指向可打印错误消息的指针(如果调用者不需要查看该消息的含义)strerror()
- e、 g.调用者可以取消引用该指针以获取错误详细信息,
- 立即通知调用者控制的例程,该例程可以在调用者认为合适时抑制或重定向错误;e、 你的库可以提供一个指向你调用的函数的指针,调用者可以重定向该指针-默认值可以记录到标准错误或其他一般可接受的操作
- 将库代码设计为
d,并使用调用者提供的预处理器宏规定错误处理行为#include
- 从库中硬编码错误消息的输出,但让调用方修改可能发送到的流,以便在需要时可以抑制它
- 返回一个小的、易于测试的数据值(数字或指针),但提供一些访问函数来轻松获取上面捕获的其他信息,以便“返回到”的代码可以执行它们喜欢的任何操作。。。
如果使用库的应用程序可能希望尝试推测性操作(例如故障转移或事务语义),尤其是如果某些错误操作具有不可逆转的后果,则需要更加认真地对待这类问题(例如,如果在STDRR上打印任何内容,一些批作业系统认为作业失败了,但是从程序的角度看,库函数可能不构成故障,或者弹出图形错误对话框会挫败无人值守的操作)。.有些选择越来越疯狂-你可能有一种本能,知道什么适合你的情况;-p这更能激发你对选择的意识:
- 捕获您认为合理的内容—
,\uuuuuuu文件
,\uuuuu行
,错误描述,正在尝试的操作,参数,结果等-在线检测错误错误号
- 原则:只做来电者希望你做的事;有很多不同的折衷方法:
- 返回一个小的、易于测试的数据值(数字或指针),但提供一些访问函数来轻松获取上面捕获的其他信息,以便“返回到”的代码可以执行它们喜欢的任何操作。。。
- e、 g.调用者可以取消引用该指针以获取错误详细信息,
-类似函数,调用者给了一个指向可打印错误消息的指针(如果调用者不需要查看该消息的含义)strerror()
- e、 g.调用者可以取消引用该指针以获取错误详细信息,
- 立即通知调用者控制的例程,该例程可以在调用者认为合适的情况下抑制或重定向错误;例如,您的库可以提供指向您调用的函数的指针,调用者可以重定向该指针-默认值可以记录到标准错误或其他一些通常可接受的操作
- 将库代码设计为
d,并使用调用者提供的预处理器宏规定错误处理行为#include
- 库中错误消息的硬代码输出,但让
- 返回一个小的、易于测试的数据值(数字或指针),但提供一些访问函数来轻松获取上面捕获的其他信息,以便“返回到”的代码可以执行它们喜欢的任何操作。。。