我应该使用哪一个?
catch (_com_error e)
或者
catch (_com_error& e)
第二。这是我引用萨特的尝试
“按值抛出,按引用捕获”
学会
catch
正确地:按值(而不是指针)抛出异常并通过引用(通常是 toconst
)捕获它们。这是与异常语义最匹配的组合。throw;
重新抛出相同的异常时,更喜欢throw e;
.
避免按值捕获异常的原因是它隐式地复制了异常。如果异常属于子类,则有关它的信息将丢失。
try { throw MyException ("error") }
catch (Exception e) {
/* Implies: Exception e (MyException ("error")) */
/* e is an instance of Exception, but not MyException */
}
通过引用捕获通过不复制异常来避免这个问题。
try { throw MyException ("error") }
catch (Exception& e) {
/* Implies: Exception &e = MyException ("error"); */
/* e is an instance of MyException */
}
就个人而言,我会选择第三种选择:
catch (const _com_error& e)
另外,请注意,在使用 MFC 时,您可能必须按指针捕获。否则,@JaredPar 的答案是您通常应该采用的方式(希望永远不必处理抛出指针的事情)。
绝对是第二个。如果您有以下情况:
class my_exception : public exception
{
int my_exception_data;
};
void foo()
{
throw my_exception;
}
void bar()
{
try
{
foo();
}
catch (exception e)
{
// e is "sliced off" - you lose the "my_exception-ness" of the exception object
}
}