我应该使用哪一个?
catch (_com_error e)
要么
catch (_com_error& e)
JaredPar.. 28
第二.这是我引用萨特的尝试
"按价值投掷,参考"
学会
catch
正确:按值(不是指针)抛出异常并通过引用(通常是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 */ }
始终复制该异常.这一点也很重要.即使被引用抓住了.区别在于您可以向下转换对子类型的引用,而按值捕获始终会对对象进行切片. (2认同)
另外,如"C++编码标准"中所述,你应该使用throw; 如果需要,重新抛出执行,而不是扔e; 因为多态性总是被throw保留; (但这只有在您通过引用捕获时才有用) (2认同)
jonner.. 13
就个人而言,我会选择第三种选择:
catch (const _com_error& e)
Kris Kumler.. 6
另外,请注意,使用MFC时,您可能必须通过指针捕获.否则,@ JaredPar的答案是你通常应该采用的方式(并且希望永远不必处理抛出指针的事情).
第二.这是我引用萨特的尝试
"按价值投掷,参考"
学会
catch
正确:按值(不是指针)抛出异常并通过引用(通常是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 */ }
就个人而言,我会选择第三种选择:
catch (const _com_error& e)
另外,请注意,使用MFC时,您可能必须通过指针捕获.否则,@ JaredPar的答案是你通常应该采用的方式(并且希望永远不必处理抛出指针的事情).