C异常处理问题
发布时间:2020-12-16 10:40:11 所属栏目:百科 来源:网络整理
导读:1)为方便起见,我将整个程序放在try块中.这样我就可以在代码中的任何一点抛出异常,并知道它将以相同的方式处理.随着程序变得更大,这种技术会导致性能下降吗? 2)如果对象在超出范围时被解除分配,为什么抛出一个临时对象是有效的?例如.: class Error : publi
1)为方便起见,我将整个程序放在try块中.这样我就可以在代码中的任何一点抛出异常,并知道它将以相同的方式处理.随着程序变得更大,这种技术会导致性能下降吗?
2)如果对象在超出范围时被解除分配,为什么抛出一个临时对象是有效的?例如.: class Error : public std::exception { private: char *m; private: Error(char *l) : m(l) {} virtual char *what() { return m; } }; int main() { try { throw Error("test"); } catch(std::exception &e) { puts(e.what()); return -1; } return 0; } 在throw语句中,为什么临时对象不会变为无效,因为它只在try范围中声明? 3)对于非英语语言的Windows操作系统,STL异常类的what()成员是否仍返回char *字符串?或者它可以返回一个wchar_t *字符串? 解决方法
从技术上讲,你不抛出实际的对象,你抛出它的副本.这就是为什么你可以放弃一个临时的.捕获引用也会获得对副本的引用.
如果你从catch块中重新抛出异常,这可能会让你感到困惑,你可能成为切片问题的牺牲品.这就是你不这样做的原因: catch (std::exception & e) { throw e; // bad,always throws std::exception rather than what was caught } 反而 catch (std::exception & e) { throw; // good,rethrows the exact copy that you caught without making another copy } 附:没有规则说你不能从那里返回一个UTF-8字符串.您可以将它转换为Windows I / O的UTF-16.标准异常类从未为Unicode明确设计或扩展,也没有为Windows添加任何非标准扩展. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |