13

我应该使用哪一个?

catch (_com_error e)  

或者

catch (_com_error& e)
4

4 回答 4

28

第二。这是我引用萨特的尝试

“按值抛出,按引用捕获”

学会catch正确地:按值(而不是指针)抛出异常并通过引用(通常是 to const)捕获它们。这是与异常语义最匹配的组合。throw;重新抛出相同的异常时,更喜欢throw e;.

这是第 73 条的完整内容。按值抛出,按引用捕获。


避免按值捕获异常的原因是它隐式地复制了异常。如果异常属于子类,则有关它的信息将丢失。

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 */
}
于 2008-09-29T23:09:02.580 回答
13

就个人而言,我会选择第三种选择:

catch (const _com_error& e)
于 2008-09-30T01:52:32.127 回答
6

另外,请注意,在使用 MFC 时,您可能必须按指针捕获。否则,@JaredPar 的答案是您通常应该采用的方式(希望永远不必处理抛出指针的事情)。

于 2008-09-29T23:14:42.270 回答
3

绝对是第二个。如果您有以下情况:

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
  }
}
于 2008-09-29T23:13:24.973 回答