Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 允许错误消息冒泡_C_Error Handling - Fatal编程技术网

C 允许错误消息冒泡

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

通用条款(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_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、 你的库可以提供一个指向你调用的函数的指针,调用者可以重定向该指针-默认值可以记录到标准错误或其他一般可接受的操作
    • 将库代码设计为
      #include
      d,并使用调用者提供的预处理器宏规定错误处理行为
    • 从库中硬编码错误消息的输出,但让调用方修改可能发送到的流,以便在需要时可以抑制它

如果使用库的应用程序可能希望尝试推测性操作(例如故障转移或事务语义),尤其是如果某些错误操作具有不可逆转的后果,则需要更加认真地对待这类问题(例如,如果在STDRR上打印任何内容,一些批作业系统认为作业失败了,但是从程序的角度看,库函数可能不构成故障,或者弹出图形错误对话框会挫败无人值守的操作)。.

有些选择越来越疯狂-你可能有一种本能,知道什么适合你的情况;-p这更能激发你对选择的意识:

  • 捕获您认为合理的内容—
    \uuuuuuu文件
    \uuuuu行
    错误号
    ,错误描述,正在尝试的操作,参数,结果等-在线检测错误
  • 原则:只做来电者希望你做的事;有很多不同的折衷方法:
    • 返回一个小的、易于测试的数据值(数字或指针),但提供一些访问函数来轻松获取上面捕获的其他信息,以便“返回到”的代码可以执行它们喜欢的任何操作。。。
      • e、 g.调用者可以取消引用该指针以获取错误详细信息,
        strerror()
        -类似函数,调用者给了一个指向可打印错误消息的指针(如果调用者不需要查看该消息的含义)
    • 立即通知调用者控制的例程,该例程可以在调用者认为合适的情况下抑制或重定向错误;例如,您的库可以提供指向您调用的函数的指针,调用者可以重定向该指针-默认值可以记录到标准错误或其他一些通常可接受的操作
    • 将库代码设计为
      #include
      d,并使用调用者提供的预处理器宏规定错误处理行为
    • 库中错误消息的硬代码输出,但让