【问题标题】:C try/except without additional modules [closed]C try/except 没有额外的模块[关闭]
【发布时间】:2022-01-11 16:30:00
【问题描述】:

我有一个 C 代码,如果在运行时发生任何错误,我想打印一个字符串。 在 python 中,这将是一个简单的尝试.. excpet.. 条件。有没有办法在 C 中做同样的事情,而不使用额外的模块?

【问题讨论】:

  • 您可以为遇到分段错误等设置信号处理程序。看这里:en.cppreference.com/w/c/program
  • 什么是“字符串”? C 没有更高级别的字符串。除非您使用一些预制库,否则您必须手动编写所有错误处理代码。
  • @Fredrik a sig faults 表明您的代码有问题,您不应尝试在运行时处理它。通过修复逻辑来修复它,不要试图偷偷摸摸
  • @Ahmed 我同意,但是如果在运行时出现问题,OP 专门要求打印一个字符串,我将其解释为他的意思是崩溃。

标签: c error-handling


【解决方案1】:

注意:对不起我的英语不好
C 没有任何异常的概念,C++ 有,但这与您的问题无关。

在 C 中我们使用不同的方法来检查错误:

  1. 混合返回值:
    • 失败的函数返回一个特殊值。 E.G malloc 在失败时返回 NULL
    • 失败的函数返回一个与大小写不匹配的值。例如,一个对数组执行操作并返回它已完成工作的数组元素的数量的函数,你给它一个包含 5 个元素的数组,它返回 3,肯定有问题。
  2. 专用返回值
    • 如果函数没有要返回的东西但会失败,它可以返回真/假或一个指示状态的数字
    • 如果函数有东西要返回,它接受一个指针参数,将数据放入指针地址,返回真/假或一个表示状态的数字。
  3. 全局错误持有者
    • 该函数将一个指示错误的值放入全局错误变量中
    • 该函数将错误附加到全局错误数组中。
  4. 信号(感谢@thebusybee)
    • 您事先设置了一个错误处理程序,然后调用该函数,该函数signals您的错误处理程序
    • 错误处理程序直接传递给函数,而不是预先设置(实际上这不是 C 程序员会做的事情,因为 C 中没有 lambdas 的标准,它变得相当混乱,为什么还要通过处理程序每​​次可以设置一次)

注意:AFAIK 信号不一定是异步的

【讨论】:

  • C 中与异常“最近”的概念是一个信号。你忘了提。
  • "请注意 c 没有真正的布尔值" 然后请告诉我们为什么 printf("%d\n", (_Bool)42); 打印 1
  • @Fredrik 我的错,我也很惊讶,自从我开始学习 C 以来,在过去的几年里我没有看到(或据我所知)_Bool。我会删除答案的“真实”部分。
  • @thebusybee 哦,我怎么忘记了最明显的那个。正在编辑...
【解决方案2】:

不完全确定您要做什么,但是 C 有一个 atexit 函数,您可以使用它来尝试将一些错误转储到 stderr。这是您在系统中注册的回调,但可以访问您的错误字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多