这段代码中的错误检查点是什么?
What is the point of error checking in this code?
我正在查看 clfft 的示例代码。我注意到他们在每次函数调用后都会为 err 分配一个值。
err = clfftCreateDefaultPlan(&planHandle, ctx, dim, clLengths);
/* Set plan parameters. */
err = clfftSetPlanPrecision(planHandle, CLFFT_SINGLE);
err = clfftSetLayout(planHandle, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED);
err = clfftSetResultLocation(planHandle, CLFFT_INPLACE);
/* Bake the plan. */
err = clfftBakePlan(planHandle, 1, &queue, NULL, NULL);
/* Execute the plan. */
err = clfftEnqueueTransform(planHandle, CLFFT_FORWARD, 1, &queue, 0, NULL, NULL, &bufX, NULL, NULL);
/* Wait for calculations to be finished. */
err = clFinish(queue);
/* Fetch results of calculations. */
err = clEnqueueReadBuffer( queue, bufX, CL_TRUE, 0, N * 2 * sizeof( *X ), X, 0, NULL, NULL );
我理解错误检查的必要性,但他们从未真正检查 return 值。他们只是将其分配给 err 并覆盖它。在我的代码中我有这个...
status = clfftSetPlanPrecision(bpm->fft_plan, bpm->float_type);
if(status != CLBPM_SUCCESS)
goto cleanup;
status = clfftSetLayout(bpm->fft_plan, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED);
if(status != CLBPM_SUCCESS)
goto cleanup;
status = clfftSetPlanScale(bpm->fft_plan, CLFFT_FORWARD, 1.0f / (bpm->grid_size * bpm->grid_size));
if(status != CLBPM_SUCCESS)
goto cleanup;
status = clfftSetPlanScale(bpm->fft_plan, CLFFT_BACKWARD, 1.0f);
if(status != CLBPM_SUCCESS)
goto cleanup;
status = clfftSetResultLocation(bpm->fft_plan, CLFFT_OUTOFPLACE);
if(status != CLBPM_SUCCESS)
goto cleanup;
示例代码只是错误代码还是错误通过函数调用传播?
我的猜测是:一个懒惰的程序员(又名 "bad code")。
你是对的,它只是丢弃了每个错误值,并没有检查它。
这并不少见,因为它可能有效 "most of the time" 并且很少使用错误路径。
对我来说,它看起来像是可以改进的代码。这比通常忽略 return 值要好,因为您可以在调试时看到实际的 return 值。在您的示例中,不需要特殊的错误处理,为了提高可读性,可以选择宏:
#define ON_ERROR_GOTO_CLEANUP(status) if(status != CLBPM_SUCCESS) goto cleanup
ON_ERROR_GOTO_CLEANUP(clfftSetPlanScale(bpm->fft_plan, CLFFT_BACKWARD, 1.0f));
我正在查看 clfft 的示例代码。我注意到他们在每次函数调用后都会为 err 分配一个值。
err = clfftCreateDefaultPlan(&planHandle, ctx, dim, clLengths);
/* Set plan parameters. */
err = clfftSetPlanPrecision(planHandle, CLFFT_SINGLE);
err = clfftSetLayout(planHandle, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED);
err = clfftSetResultLocation(planHandle, CLFFT_INPLACE);
/* Bake the plan. */
err = clfftBakePlan(planHandle, 1, &queue, NULL, NULL);
/* Execute the plan. */
err = clfftEnqueueTransform(planHandle, CLFFT_FORWARD, 1, &queue, 0, NULL, NULL, &bufX, NULL, NULL);
/* Wait for calculations to be finished. */
err = clFinish(queue);
/* Fetch results of calculations. */
err = clEnqueueReadBuffer( queue, bufX, CL_TRUE, 0, N * 2 * sizeof( *X ), X, 0, NULL, NULL );
我理解错误检查的必要性,但他们从未真正检查 return 值。他们只是将其分配给 err 并覆盖它。在我的代码中我有这个...
status = clfftSetPlanPrecision(bpm->fft_plan, bpm->float_type);
if(status != CLBPM_SUCCESS)
goto cleanup;
status = clfftSetLayout(bpm->fft_plan, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED);
if(status != CLBPM_SUCCESS)
goto cleanup;
status = clfftSetPlanScale(bpm->fft_plan, CLFFT_FORWARD, 1.0f / (bpm->grid_size * bpm->grid_size));
if(status != CLBPM_SUCCESS)
goto cleanup;
status = clfftSetPlanScale(bpm->fft_plan, CLFFT_BACKWARD, 1.0f);
if(status != CLBPM_SUCCESS)
goto cleanup;
status = clfftSetResultLocation(bpm->fft_plan, CLFFT_OUTOFPLACE);
if(status != CLBPM_SUCCESS)
goto cleanup;
示例代码只是错误代码还是错误通过函数调用传播?
我的猜测是:一个懒惰的程序员(又名 "bad code")。
你是对的,它只是丢弃了每个错误值,并没有检查它。
这并不少见,因为它可能有效 "most of the time" 并且很少使用错误路径。
对我来说,它看起来像是可以改进的代码。这比通常忽略 return 值要好,因为您可以在调试时看到实际的 return 值。在您的示例中,不需要特殊的错误处理,为了提高可读性,可以选择宏:
#define ON_ERROR_GOTO_CLEANUP(status) if(status != CLBPM_SUCCESS) goto cleanup
ON_ERROR_GOTO_CLEANUP(clfftSetPlanScale(bpm->fft_plan, CLFFT_BACKWARD, 1.0f));