- 主题:大家都用C++的try catch吗?
windows上,32位程序需要建立exception frame,64位没有建立exception frame的运行时开销,在没发生exception时是zero-cost的
【 在 AlphaO 的大作中提到: 】
: 到底是多“点”很关键
: 暂时不讨论偶发运行的程序块,影响不大。对于那些反复常态运行的,每次进入try都有开销,包含越大、代价容易越大,而且阻止内部优化,例如缓存啥的几乎全没了,对循环更是灾难,同样的代码编译出来肯定慢
--
FROM 222.128.162.*
【 在 chaobill 的大作中提到: 】
: 异常挺好的
: LoginException::ThrowOn(!$username, "用户名不存在",);
: LoginException::ThrowOn(empty($password),"请输入密码");
: ...................
哈哈, 一旦涉及到哪种更好/更优雅/更清晰, 往往就扯不清楚大家各自有想法。
还是直接说某种场景下只能这么干, 不容易引起争论。
--
FROM 1.91.36.*
“try catch是zero-cost”我不信
【 在 z16166 的大作中提到: 】
: windows上,32位程序需要建立exception frame,64位没有建立exception frame的运行时开销,在没发生exception时是zero-cost的
:
--
FROM 1.202.157.*
请仔细阅读,是x64在没抛出异常时才是zero-cost的;抛出异常时当然不是zero-cost的,要查表处理异常。
x64的异常处理信息是编译期写入了PE文件的。
【 在 AlphaO 的大作中提到: 】
: “try catch是zero-cost”我不信
:
--
FROM 222.128.162.*
所以根源在于,你认为zero-cost是指“在编译期生成代码”,生成了代码,就是zero-cost?
【 在 z16166 的大作中提到: 】
: 请仔细阅读,是x64在没抛出异常时才是zero-cost的;抛出异常时当然不是zero-cost的,要查表处理异常。
: x64的异常处理信息是编译期写入了PE文件的。
:
--
FROM 1.202.157.*
其实我没理解 c++ 的 try catch 是怎么实现机制
按 C 语言来说,发生 异常,如被0除, 抛出 的是错误码才是最自然的方式
C++ throw 的时候,构造 Exception 类 是什么机制
【 在 z16166 的大作中提到: 】
: 请仔细阅读,是x64在没抛出异常时才是zero-cost的;抛出异常时当然不是zero-cost的,要查表处理异常。
: x64的异常处理信息是编译期写入了PE文件的。
--
FROM 223.198.83.*
std::stod
在数据越界的时候抛 std::out_of_range ,这个怎么定义小概率呀
数据长啥样子都可能
【 在 chaobill 的大作中提到: 】
: 异常本身就是小概率事件
--
FROM 47.96.236.*
C++异常的主要问题是它个半拉子,拉屎拉一半。
最开始,你按照书上说的用了异常,一切都显得很高大上。
当项目变得有一点规模以后,你调一个函数,然后这个函数你不知道啥原因就会抛出一个异常,你不catch就会崩,你要catch也不知道该catch啥类型,不过你还是catch了抛出的那个。
但是它又冒出第二个、第三个、第N个异常,你开始烦了,但是你还是耐心地全部catch了一通,代码变得很冗长。
但是你发现就算你仔细看了这个函数,还是保不齐这个函数下面的函数会抛异常,于是有时候你catch(...),有时候你又觉得应该负责任一些,于是继续往上throw
然后你的上层函数又发疯了,怎么原先好好的突然又异常了呢!算了catch(...)吧。
但是到处都catch(...)之后也很奇怪,于是你在顶层又catch(...)
然后你发现程序行为变得很诡异,总觉得哪里出错了,但是又不知道究竟是哪里出错,于是你开始注释掉catch(...),让错误在第一时间暴露出来。
最后你发现,转了一圈你又回来了。
这就好比你去餐厅吃个饭,结果发现有的菜没货了你会死,菜上错了你会死,服务员不高兴了你会死,筷子放错方向了你会死,整个供应链无论哪里出个unhandled exception你都会死。。。
【 在 wjhtingerx 的大作中提到: 】
: 这玩意儿把出问题的调用栈都弄没了,反倒不利于调试吧?
--
修改:yuanmo FROM 221.216.117.*
FROM 221.216.117.*
那是你不了解好不?生成的是数据表,而不是指令
咄咄逼人地反问别人之前,好歹去查一下资料啊
【 在 AlphaO 的大作中提到: 】
: 所以根源在于,你认为zero-cost是指“在编译期生成代码”,生成了代码,就是zero-cost?
:
--
修改:z16166 FROM 222.128.162.*
FROM 222.128.162.*
就是这个道理。你一个第三方库老老实实地办事就行了,要么成功,要么失败顺便说一个失败原因,我自己会处理。
结果你办事失败了,还抛给我N种死法让我猜,猜错一个就原地爆炸。。。
【 在 mopo 的大作中提到: 】
: 一般第三方库很不识相抛异常的时候才会勉强用用,不像java能用就用
: 事实上catch后能做的动作并不多,能用c++写的大概率偏底层,这种时候出异常了,除非是网络和I/O可以重试一下,其他严重错误还不如死了重新拉起来
--
FROM 221.216.117.*