C function error: is it better to abort the function or simply exit the program?
C function error: is it better to abort the function or simply exit the program?
标题说明了一切。由于 C 没有异常,我不确定如何处理错误。我想过两者的优缺点:
中止:
基本上我的意思是 return 一个错误代码(将在 .h 文件中声明,可能有它自己的 perror()
-like 函数)并中止该函数,明显的优点是它可以帮助用户做 error-handling,但缺点是:
- 如果函数执行后没有每次都检查错误,而确实发生了错误,那么随着程序的进行可能会出现很大的问题,用户将很难找到问题出在哪里来自.
- 在 header 文件中查找错误代码可能既困难又烦人。
- 错误代码可能与其他库中的错误代码或内置的 C 错误代码冲突。
退出程序:
Pretty self-explanatory:一旦发现错误,就将错误打印到stderr
并退出。这样做的好处是,如果错误消息足够详细,用户将很容易知道他们的代码出了什么问题并修复它,但主要的缺点是用户将无法编写任何代码来处理可能出现的问题错误,而不得不更改代码本身(当您需要输入或类似的东西时,这会成为一个更大的问题,其中有数百万可能由不正确的输入引起的错误)。
Return 来自该函数的正确错误代码。否则很难在不同的上下文中使用该函数,比如单元测试。调用程序也不可能清理它的资源,或者只是打印一条错误消息。
这在很大程度上取决于您的程序在做什么。一些程序,例如简单的命令行实用程序,只会在无效输入时中止,而不会对用户体验和系统稳定性造成太大影响。用户将简单地纠正自己并重新运行。另一方面,如果它是一个安全关键系统,例如军事、医疗或运输设备(读取自动驾驶仪、心脏起搏器等),中止其程序将导致人员丧生。或者按照评论中的建议 - 一个简单的文字处理器。如果用户在犯了一些导致程序错误的愚蠢错误后失去了所有工作,他们可能会非常不满意。
因此,编写健壮软件的一般方法是将错误分为致命错误和非致命错误。非致命是您在正常程序 运行 期间可以预料到的,并且可以以允许程序继续的方式妥善处理。致命的是由于某些异常情况(硬件故障,缺少组件等)导致程序无法继续的。
根据系统性质,您可能希望放宽或收紧上述分类。
标题说明了一切。由于 C 没有异常,我不确定如何处理错误。我想过两者的优缺点:
中止:
基本上我的意思是 return 一个错误代码(将在 .h 文件中声明,可能有它自己的 perror()
-like 函数)并中止该函数,明显的优点是它可以帮助用户做 error-handling,但缺点是:
- 如果函数执行后没有每次都检查错误,而确实发生了错误,那么随着程序的进行可能会出现很大的问题,用户将很难找到问题出在哪里来自.
- 在 header 文件中查找错误代码可能既困难又烦人。
- 错误代码可能与其他库中的错误代码或内置的 C 错误代码冲突。
退出程序:
Pretty self-explanatory:一旦发现错误,就将错误打印到stderr
并退出。这样做的好处是,如果错误消息足够详细,用户将很容易知道他们的代码出了什么问题并修复它,但主要的缺点是用户将无法编写任何代码来处理可能出现的问题错误,而不得不更改代码本身(当您需要输入或类似的东西时,这会成为一个更大的问题,其中有数百万可能由不正确的输入引起的错误)。
Return 来自该函数的正确错误代码。否则很难在不同的上下文中使用该函数,比如单元测试。调用程序也不可能清理它的资源,或者只是打印一条错误消息。
这在很大程度上取决于您的程序在做什么。一些程序,例如简单的命令行实用程序,只会在无效输入时中止,而不会对用户体验和系统稳定性造成太大影响。用户将简单地纠正自己并重新运行。另一方面,如果它是一个安全关键系统,例如军事、医疗或运输设备(读取自动驾驶仪、心脏起搏器等),中止其程序将导致人员丧生。或者按照评论中的建议 - 一个简单的文字处理器。如果用户在犯了一些导致程序错误的愚蠢错误后失去了所有工作,他们可能会非常不满意。
因此,编写健壮软件的一般方法是将错误分为致命错误和非致命错误。非致命是您在正常程序 运行 期间可以预料到的,并且可以以允许程序继续的方式妥善处理。致命的是由于某些异常情况(硬件故障,缺少组件等)导致程序无法继续的。
根据系统性质,您可能希望放宽或收紧上述分类。