【问题标题】:Why check only certain values for errors? (C++?)为什么只检查某些值的错误? (C++?)
【发布时间】:2009-10-01 09:01:28
【问题描述】:

我最近开始学习 DirectX/Windows,我正在学习的书有代码

d3d = Direct3DCreate9(D3D_SDK_VERSION);
if(d3d == NULL)
    //catch error &c.

我的问题是:什么会导致这一行出错,这与导致另一行出错的原因不同(例如,int num = 42)?

【问题讨论】:

    标签: c++ windows error-handling directx


    【解决方案1】:
    d3d = Direct3DCreate9(D3D_SDK_VERSION);
    if (d3d == NULL)
    

    这是否错误取决于您赋予 Direct3DCreate9 的返回值的含义,即取决于函数的规范。我写了很多指针返回函数,NULL 作为返回值并不是错误的情况。

    因此,不要将“返回 NULL 的函数”等同于“错误”。明确的错误是代码中的崩溃(从技术上讲,未定义的行为),例如 d3d 确实为 NULL 并且稍后您取消引用它。

    int num = 42;
    

    在这里,您声明了一个名为 num 的 int 变量并将其初始化为 42。您能想到什么样的错误?显然, num 永远不会“为 NULL”,如果这让您感到困扰的话。 42 可能是正确的值,也可能是错误的值,具体取决于上下文。

    【讨论】:

      【解决方案2】:

      我认为评论表明如果Direct3DCreate9(D3D_SDK_VERSION); 已返回NULL,那么这是一个应该处理的错误。

      来自 msdn:

      IDirect3D9 * Direct3DCreate9( UINT SDK版本);

      参数

      SDK版本 此参数的值应为 D3D_SDK_VERSION。见备注。

      返回值

      如果成功,此函数返回一个 指向 IDirect3D9 接口的指针; 否则返回 NULL 指针。

      并不是说比较d3d == NULL可能会抛出异常。

      【讨论】:

      • 我的意思是,是什么使得该错误比其他错误更需要被捕获:什么错误检查语句会返回 NULL?
      • 因为有记录表明调用可能会失败以及在这种情况下会出现什么结果。错误检查语句不返回 NULL,函数可以在失败的情况下返回 NULL 指针。
      • 我不确定我是否理解这个问题。 Direct3DCreate9(D3D_SDK_VERSION) 如果失败,将返回 NULL。因此,如果失败 d3d 将包含值 NULL,if 语句通过检查是否 d3d==NULL 来处理失败。该评论具有误导性,没有抛出异常。您必须在那里检查 NULL,因为如果 Direct3dCreate9 失败,您没有指向 IDirect3d9 接口的指针,并且您无法对 d3d 进行任何调用。
      • 还要注意 d3d == NULL 是比较而不是赋值。它只返回真或假。它不返回 NULL,而是检查 NULL。
      • @UncleBens - 那只是我的打字速度比我想象的要快,我的意思是什么会导致正在检查错误的语句返回 NULL。
      【解决方案3】:

      捕获该错误很重要,因为它是一个阻碍因素,而且它可以而且确实会发生。至于其他错误-我不知道您在说什么其他错误。

      当然所有的错误都应该检查和处理。但请记住,在一本书中,首要任务是使关键点尽可能可读和易于理解。完整的错误检查会阻碍这一点,所以它经常被当作臭名昭著的练习留给读者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-21
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 2012-07-26
        • 1970-01-01
        相关资源
        最近更新 更多