我的理解是,在现代C++中,最好使用throw
,而不是返回一个错误代码,也就是说,如果我有某个函数:
void MyFunction(int foo, double bar){
// Do some stuff....
if (exception_criteria_met){
throw "Call to MyFunction with inputs" << foo << " and " << bar << " failed because ...";
}
};
这是否意味着,为了正确处理这个问题,那么在所有调用MyFunction
的函数中,我必须实现如下内容:
void MyOuterFunction(int foo){
// Do some stuff...
try {
MyFunction(foo, bar);
} catch (const char * exception_message) {
throw "Call to MyOuterFunction with inputs " << foo << " failed because call to MyFunction with ....";
};
那不就意味着我必须,对调用这个函数调用堆栈的所有函数,执行同样的错误处理吗,很明显,在某个时候,也许其中一个函数,可以处理异常,而不需要抛出它自己的异常,但也许只是打印一个警告或类似的东西。但你如何保持这一组织和理解?这似乎是一个非常复杂的事情,要想通过所有的方式,当你我们有许多相互作用的函数。
(As第二个问题是,如果MyFunction(foo,bar)
要返回一个我想使用的值,这是否意味着在离开try { }
块之后,返回的值将超出作用域?这是否意味着如果我要使用try-catch
,就应该避免使用函数返回值?)
1条答案
按热度按时间jchrr9hc1#
我认为你大部分的问题不是太广泛,就是基于观点,或者两者兼而有之。然而,你的困惑似乎始于
那么在所有调用MyFunction的函数中,我必须实现类似这样的东西:
这是不对的
调用可能抛出的
MyFunction
的函数可能如下所示:如果你必须总是立即捕获异常,那么异常将是相当不切实际的,它们不是这样工作的。
简而言之:异常继续在调用堆栈中向上传递,直到您捕获它,或者到达
main
但仍然没有捕获它,在这种情况下,程序终止。在哪里应该捕获异常并没有固定的规则。我个人的经验法则是在有可能从异常中恢复时捕获异常,但不要更快。有时候根本不捕获异常是最可行的。捕获并重新引发异常很少有用,捕获异常只是为了重新引发异常,就我所知,这是毫无用处的。