【发布时间】:2012-10-01 12:40:03
【问题描述】:
就编码风格而言,以下两种实现中哪一种更好,为什么?
UINT Fn1()
{
HKEY hRegKey;
if(RegOpenKeyEx(..., KEY_NAME, &hRegKey) != ERROR_SUCCESS)
return ERROR_KEY_OPEN;
if(RegQueryValueEx(hRegKey, VAL_A_NAME, ...) != ERROR_SUCCESS)
{
RegCloseKey(hRegKey);
return ERROR_KEYVAL_A;
}
if(RegQueryValueEx(hRegKey, VAL_B_NAME, ...) != ERROR_SUCCESS)
{
RegCloseKey(hRegKey);
return ERROR_KEYVAL_B;
}
RegCloseKey(hRegKey);
return ERROR_SUCCESS;
}
UINT Fn2()
{
UINT rVal;
HKEY hRegKey;
if(RegOpenKeyEx(..., KEY_NAME, &hRegKey) == ERROR_SUCCESS)
{
if(RegQueryValueEx(hRegKey, VALUE_A_NAME, ...) == ERROR_SUCCESS)
{
if(RegQueryValueEx(hRegKey, VALUE_B_NAME, ...) == ERROR_SUCCESS)
rVal = ERROR_SUCCESS;
else
rVal = ERROR_KEYVAL_B;
}
else
rVal = ERROR_KEYVAL_A;
RegCloseKey(hRegKey);
}
else
rVal = ERROR_KEY_OPEN;
return rVal;
}
另外,还有更好的方法吗?
注意:请不要混淆 sn-p 的细节 - 强调代码流和样式。
【问题讨论】:
-
这个答案对于 C 或 C++ 会有所不同,但你已经标记了两者。此外,这是一个相当主观的问题。
-
请回答 - 对于通用场景。我没有将问题转换为更通用的形式以使其更真实。
-
之前有人问过这个问题:Here 和Programmers.SE。这两次,回答者都更喜欢“提前返回”(即您的第一个版本)
-
@ArjunShankar 感谢您的指点。但这种情况与返回前所需的
clean-up不同。我已经修改了我的问题,我认为对于其他有类似疑问的人来说,它仍然是useful。
标签: c coding-style error-handling return