如何在用C++编译的C库中处理运行时错误?

voi*_*ter 3 c c++ windows exception

假设我有一个C库,我使用Visual Studio链接到Windows上的C++程序.这个C库是黑盒子.如果此库中发生致命错误(例如取消引用null),程序/ OS将如何处理此运行时错误?我在C++中知道存在空引用异常,因此您可以使用try/catch处理此类错误,但由于这是一个C库,它不会发出一个throw,对吧?那会发生什么?该程序将终止,但通过什么方式,如果不是C++异常?

Ker*_* SB 6

您永远不能"处理"取消引用空指针.执行此操作后,您的程序将不再处于定义良好的状态,并且无法确定性地继续执行.唯一的行动方案是terminate(),如果您尚未注册SIGSEGV处理程序,操作系统将代表您进行操作.

"错误"这个词有几个含义可能会令人困惑:一方面,一个无法执行其预期任务的功能可能会被称为遇到"错误",并且可能会发出这样的信号:通过合适的返回值,或通过抛出异常.这种行为最好称为失败.必须准备一个正确的程序来处理函数可能返回的所有可能方式.另一方面,编程错误只会导致错误甚至形成错误的程序.正确的程序绝不能有任何编程错误.

例如,malloc()可能会失败(如果它找不到足够的空间),它通过返回空指针发出信号,但是如果它在malloc()不检查的情况下取消引用结果,则程序将会出错.

通过进一步编程,您永远不会"捕获"或"处理" 编程错误.相反,正确的程序必须正确地预测和处理组件功能的所有故障条件,并且递归地正确编写的功能必须始终以明确定义的方式返回并且适当地发出信号故障.