gpt4 book ai didi

c - 在 C 中实现错误传播的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 07:38:31 25 4
gpt4 key购买 nike

我来自有异常的高级语言(尤其是 C#),我通常只捕获我的逻辑知道如何处理的异常——否则,它们会传播并导致程序崩溃,但至少它提供了关于异常的清晰信息发生了什么,在哪里。我想在 C 中实现类似的行为。我想在我的 main 的小主体中,从我调用的函数中获取错误代码,确定发生了什么,并将错误消息打印到stderr 并退出并返回与我相同的错误代码。

  1. 第一个问题 — 人们会用 C 来做吗?就架构而言,这是一个好的目标吗?

  2. 第二个问题是关于错误返回码和 errno。默认情况下,我应该在我的代码中使用什么?看起来这两个约定在 C 标准库中可以互换使用,而且非常困惑。

  3. 第三个问题是关于错误代码本身。在 C# 和 Java 中,除了特定注释之外,标准异常类型几乎涵盖了您通常会抛出的所有内容。我应该为此目的使用 errno 错误代码表,还是应该为我的应用程序创建一个单独的错误代码表以包含它特定的所有内容?或者每个函数都应该维护它自己的特定错误代码表?

  4. 最后,关于错误的附加信息:我发现至少在 C# 中,能够抛出带有提供附加信息的特定注释的预定义类型的异常是非常有用的。 C错误管理中是否使用了类似的东西?我应该如何实现?

  5. 为什么库函数同时使用返回码 errno,而不是只使用其中一个?两者结合使用有什么好处?

最佳答案

看来,你可以利用errno变量和 perror()功能。它们有助于提供大部分时间失败的原因。

大多数库函数,为了指示失败,将通常返回一个带前缀的负值(主要是-1)并设置errno 变量为特定值,具体取决于错误类型。

is it normally used for this purpose?

是的,这就是使用 errnoperror() 的目的,恕我直言。

现在,如果是用户定义的函数,您可以为库函数返回的错误创建自己的错误代码(需要一些映射时间),并且可以从您的函数返回您自己的值。


编辑:

What's the benefit in using both?

在发生故障事件时,以简单的方式区分故障原因。

可以这样想,而不是有一个固定的错误返回值和设置errno,如果一个函数为每种类型的错误返回不同的值,那么有多少个if-else switch 语句是否需要在每次调用时检查被调用函数是否成功?这是巨大的。

而是使用固定的返回值来指示错误,如果有错误,则检查 errno 以了解错误背后的原因。

[希望我说清楚了。英语不是我的母语,抱歉]

关于c - 在 C 中实现错误传播的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31027834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com