我在一个多项选择题中被问到以下程序在做什么:
catch(const std::exception& e){
throw e;
}
我回答说是重新抛出 e (答案C)。但答案显然是错误的。
那它在做什么?扔一份 e (答案D)?
另一个可能的答案是:A)处理异常B)捕获e中的当前堆栈跟踪
由于
答案 0 :(得分:10)
throw
语句复制了它的参数。这意味着throw e;
切片e
到它的基类(或者e
的静态类型)。要重新抛出原始异常,请使用throw;
。
答案 1 :(得分:2)
它会抛出e
的副本。答案D是正确的。
简单地重新投掷:
catch(const std::exception& e) {
throw;
}
答案 2 :(得分:1)
它正在正在做什么<锡> :你重新投掷e
。从概念上讲,虽然没有副作用,编译器可以优化掉任何深层副本,但仍会采用e
的值副本。
要保证没有复制,只需写下throw;
。