C++ 关于程序设计中一般错误处理的问题

C++ 关于程序设计中一般错误处理的问题,c++,error-handling,C++,Error Handling,在谈到错误处理时,我有些困惑。 以Direct2D为例。 在开始使用Direct2D功能之前,我们必须创建ID2DFactory对象: HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &d2d1Factory); 从上面你可以看到。我们可以检查HRESULT hr以查看是否已成功创建ID2DFactory。 我认为当这个调用失败时,即使我再次调用它,它仍然失败。我们没有任何方法从这次失败中恢复 那么检查

在谈到错误处理时,我有些困惑。 以Direct2D为例。 在开始使用Direct2D功能之前,我们必须创建ID2DFactory对象:

HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &d2d1Factory);
从上面你可以看到。我们可以检查HRESULT hr以查看是否已成功创建ID2DFactory。 我认为当这个调用失败时,即使我再次调用它,它仍然失败。我们没有任何方法从这次失败中恢复

那么检查返回值有什么意义呢?这样我们就可以在终止程序之前告诉用户出了什么问题吗

另一个例子是内存不足。当我们遇到罕见的情况,我们没有足够的内存,我们的程序“新”一些对象。 在C++中,当内存用完时,新操作符可能返回null或引发错误。如果不测试它是否为NULL,也不捕获错误,则程序将终止。我认为你的程序无法从这种情况中恢复过来


那么,再次强调一下,检查是否存在严重错误的意义是什么,您对此无能为力?

首先,并非所有错误都是不可恢复的。示例:如果用户想要打开的文件不可用,程序可能希望向用户报告此情况,并要求打开另一个文件


其次,即使程序无法继续,它也必须有机会优雅地终止,通知用户问题、保存状态、记录问题以供将来分析等,而不仅仅是崩溃。如果没有错误检查,程序很可能会崩溃。

首先,并不是所有错误都是不可恢复的。示例:如果用户想要打开的文件不可用,程序可能希望向用户报告此情况,并要求打开另一个文件


其次,即使程序无法继续,它也必须有机会优雅地终止,通知用户问题、保存状态、记录问题以供将来分析等,而不仅仅是崩溃。如果不进行错误检查,程序很可能会崩溃。

是否有客户的错误报告说“它刚刚崩溃”?当错误报告包含一个错误对话框的屏幕截图,上面写着“D2D1CreateFactory返回了E_……”时,它们会更有用。

有没有过客户的错误报告,上面写着“它刚刚崩溃”?当错误报告中包含错误对话框的屏幕截图,上面写着“D2D1CreateFactory返回E_……”时,它们会更有用。

可能有很多事情需要清理,比如打开的文件句柄,或者一些数据库回滚操作等,在出现错误时需要执行这些操作。在某些情况下,错误可能并不严重,并且程序可能仅在部分功能可用的情况下继续,而不是完全崩溃。最后但并非最不重要的一点是,它提供了有关错误发生位置的有价值的信息,这对于调试是非常宝贵的


,除非你使用了一些不符合的古编译器,<代码>新< /COD>不能按照C++标准返回null,它必须在代码失败时抛出<代码> STD::BADYOLLC/<代码>异常。或者在发生错误时需要执行的一些数据库回滚操作等。在某些情况下,错误可能并不严重,并且程序可能仅在部分功能可用的情况下继续,而不是完全崩溃。最后但并非最不重要的一点是,它提供了有关错误发生位置的有价值的信息,这对于调试是非常宝贵的


BTW,除非您使用的是不符合的编译器,否则代码< > < <代码>不能按照C++标准返回null,它必须在代码失败时抛出<代码> STD::BADYOLLC/<代码>异常。只需使用宏即可。

检查返回值,这对于调试总是至关重要的。只需使用宏即可。

想象两个程序各自遇到错误

一个因内存不足或其他原因而崩溃,导致非法使用内存,操作系统要么显示一些模糊的错误,要么只是默默地关闭程序

另一个应用程序显示更简单的错误消息,然后回滚导致错误的操作,以便您可以决定是否要继续和/或尝试解决导致错误的条件。(例如,关闭一些其他应用程序可能会允许有更多内存。)


您希望使用哪个程序?

想象两个程序,每个程序都会遇到错误

一个因内存不足或其他原因而崩溃,导致非法使用内存,操作系统要么显示一些模糊的错误,要么只是默默地关闭程序

另一个应用程序显示更简单的错误消息,然后回滚导致错误的操作,以便您可以决定是否要继续和/或尝试解决导致错误的条件。(例如,关闭一些其他应用程序可能会允许有更多内存。)


您希望使用哪个程序?

像D2D1CreateFactory()这样的初始化函数可能会失败。这种故障通常意味着您电脑上的O/S完全堵塞,您需要重新启动。此信息对用户很有价值,用户希望了解“O/S已安装软管,重新启动并重试”与“模块mod.c中2345处无参考”。如果您没有捕捉到错误情况,用户只知道程序崩溃了

捕获错误返回和异常并向用户报告是区分好程序和差程序的众多因素之一

特别是对于new,您的程序通常有许多选项。它可能能够重新请求较小的初始内存块。它可能能够返回包含缓存值的内存,然后重试。它也许能