我们今天在工作中一直在讨论这个话题,我们谁也无法对这个问题给出明确的答案。考虑以下情况:
int foo()
{
int err;
err = some_call(1);
if (err != 0)
return err;
err = some_call(2);
if (err != 0)
return err;
err = some_call(3);
if (err != 0)
return err;
err = some_call(4);
if (err != 0)
return err;
bar();
return err;
}
有很多代码重复。显然,这可以用宏分解,遗憾的是不能用模板分解(因为 return 子句)。或者至少不是直接的。
现在的问题是,如果我们用异常替换那些返回错误代码,并立即捕获这些异常,编译器是否允许并且足够聪明以检测模式并完全避免抛出异常?
这是我的意思的说明:
int foo()
{
try
{
// some_call now throws a ErrorReturned exception that contains the error code upon failure.
some_call(1);
some_call(2);
some_call(3);
some_call(4);
}
catch (ErrorReturned& ex)
{
return ex.error_code();
}
bar();
return 0;
}
现在,没有当前的性能问题,所以是的,我们不需要优化甚至关心它。这更多地是为了了解允许编译器做什么。
简而言之,这是一种“好”的做法吗?如果是这样,编译器可以通过不抛出异常来优化它吗?(假设异常构造没有副作用)