- 主题:大家都用C++的try catch吗?
其实还有个原因是qt至今也不是完全的异常安全的。真正的原因也可能是根本就没人手去整个翻新一遍,qt早期版本开发时,c++异常还很不完善。
win7已经被MS放弃,qt没理由继续支持win7的
【 在 hgoldfish 的大作中提到: 】
: Qt 6 也没看他们改出异常啊。
: 他们哪里真的在乎低版本的兼容性?笑话,最低 C++ 标准要求 C++ 17. 连 Win7 也不兼容了。
:
--
修改:z16166 FROM 222.128.162.*
FROM 222.128.162.*
try-catch用来捕捉的是外部不可预知的异常,内部的异常应该通过异常分支解决,解决不了的,只能throw,比如内存申请失败。
这就是principle,这都不懂,就别写C++
【 在 yuanmo 的大作中提到: 】
: 因为C++的异常就是根本就搞不清楚,或者说它是一个既要又要还要的乌托邦式的设计。
: 就算你认为你搞清楚了,那也只是你觉得你清楚了。你用的库,你的同事,你的上级你的下属,都有自己各自的理解和习惯,大概率人家还觉得你的理解不对呢。
: 一个无法达成共识的东西,那就是设计有问题,不要怪这一届的用户不行。
: ...................
--
FROM 106.3.194.*
培训、自我培训不够。很多搞C++的甚至是从C开始学起,或者从C转过来的,习惯是C的那套(说到这里有些人可以趁机再批一下谭浩强了),连RAII这种C++基本技法都不用,更遑论异常了。而不用RAII基本上也就没有异常安全保证,强行上异常那也是个灾难。骨子里还是懒,疏于学习,但是会找996没时间、生活艰难等借口来搪塞。
有话语权的架构师之类的,自己可能也对异常不熟悉,搞不出来行之有效的普及办法。也没啥动力,毕竟难于体现在KPI上,花很多精力搞不好还要被罚,多一事不如少一事,就继续用原来的那套好了。
但是,把责任归咎于c++异常有问题,可以参看97楼的转发的观点,简单说,就是把自己的无能和懒惰推给C++异常来当替罪羊。
【 在 yuanmo 的大作中提到: 】
: 因为C++的异常就是根本就搞不清楚,或者说它是一个既要又要还要的乌托邦式的设计。
: 就算你认为你搞清楚了,那也只是你觉得你清楚了。你用的库,你的同事,你的上级你的下属,都有自己各自的理解和习惯,大概率人家还觉得你的理解不对呢。
: 一个无法达成共识的东西,那就是设计有问题,不要怪这一届的用户不行。
: ...................
--
修改:z16166 FROM 222.128.162.*
FROM 222.128.162.*
上升到哲学高度了?c++异常就是不好,竟然还有人争论?
再说个c++最成功的一个领域,虚幻引擎都是默认禁用异常的。为啥?虚幻的设计师和开发人员都是很差?
【 在 z16166 的大作中提到: 】
: 培训、自我培训不够。很多搞C++的甚至是从C开始学起,或者从C转过来的,习惯是C的那套(说到这里有些人可以趁机再批一下谭浩强了),连RAII这种C++基本技法都不用,更遑论异常了。而不用RAII基本上也就没有异常安全保证,强行上异常那也是个灾难。骨子里还是懒,疏于学习,但是会找996没时间、生活艰难等借口来搪塞。
:
: 有话语权的架构师之类的,自己可能也对异常不熟悉,搞不出来行之有效的普及办法。也没啥动力,毕竟难于体现在KPI上,花很多精力搞不好还要被罚,多一事不如少一事,就继续用原来的那套好了。
: ...................
--来自微微水木3.5.14
--
FROM 222.64.154.*
c++异常不好,那只是你的结论而已,居然被你说成了放之四海而皆准颠扑不破的真理了
无知又不学习,还死抱着自己的观点不放的,是什么人呢
游戏引擎在使用时有帧数要求,类似准实时系统。
对处理时间有要求的领域,是不适合用异常的,这个帖子的前面楼层已经有人问过,你没仔细看。
因为异常的处理时间无法做到固定,比如堆栈unwind时要查表几级、析构多少个对象是无法预知的。
还有个原因,一些成功的库或者框架,在最初开发时,C++的异常和其他标准都不成熟,不用异常,甚至不用STL都是可能的,不能说明什么问题。
【 在 foliver 的大作中提到: 】
: 上升到哲学高度了?c++异常就是不好,竟然还有人争论?
: 再说个c++最成功的一个领域,虚幻引擎都是默认禁用异常的。为啥?虚幻的设计师和开发人员都是很差?
:
--
修改:z16166 FROM 222.128.162.*
FROM 222.128.162.*
为啥游戏不能用异常,虚幻自带了反射系统,这个消耗不大?你这是自相矛盾。
再给你一个LLVM的编码标准
Do not use RTTI or Exceptions
In an effort to reduce code and executable size, LLVM does not use exceptions or RTTI (runtime type information, for example, dynamic_cast<>).
That said, LLVM does make extensive use of a hand-rolled form of RTTI that use templates like isa<>, cast<>, and dyn_cast<>. This form of RTTI is opt-in and can be added to any class.
Android NDK也默认不支持异常。
所有这些都表明C++异常有缺陷,性能,代码尺寸,处理复杂度等等都导致它不是一个好的特性。
【 在 z16166 的大作中提到: 】
: c++异常不好,那只是你的结论而已,居然被你说成了放之四海而皆准颠扑不破的真理了
: 无知又不学习,还死抱着自己的观点不放的,是什么人呢
: 游戏引擎在使用时有帧数要求,类似准实时系统。
: ...................
--
FROM 222.64.154.*
你试图用某几个项目没有使用异常,来证明异常不靠谱,这本身是个错误的推理。
因为按你这个推理,只有100%的项目都使用了异常,才能证明异常是靠谱的。
"unreal engine没使用异常,是因为游戏帧数有响应时间要求",这是我拍脑袋的分析。对错与否,可以继续辩。
实际上,性能问题是unreal关注的重点之一。它自己的编码规范写的:
"从历史上看,UE 避免直接使用 C 和 C++ 标准库。造成这种情况的原因有几个,包括:用我们自己的实现替换缓慢的实现,允许对内存分配进行额外的控制,在广泛可用之前添加新功能,进行理想但非标准的行为更改,在整个代码库中具有一致的语法,或者避免与 UE 的习惯用法不兼容的构造。然而,近年来,标准库变得更加稳定和成熟,并且包含了我们不想用抽象层包装或自己重新实现的功能。"
以上是unreal不使用某些C/C++特性的原因。在unreal早期开发时,C/C++的很多基础设施还不够好,包括跨平台的异常支持,但是一旦C/C++的标准实现比unreal自己撸的还要好时,它也是允许提出替换的,是开放的。
C++抛出异常时确实有开销,而且可能还不小,这个我也没否认,所以才会认为可能影响游戏帧数响应。
不光是反射,unreal还有GC,这是它自己的balance,牺牲一点性能换取其他好处。能支持脚本开发,就是为了享用脚本开发的便利性和扩展性。
【 在 foliver 的大作中提到: 】
: 为啥游戏不能用异常,虚幻自带了反射系统,这个消耗不大?你这是自相矛盾。
: 再给你一个LLVM的编码标准
: Do not use RTTI or Exceptions
: ...................
--
FROM 222.128.162.*
那你就告诉我,那些项目使用了异常?
我好歹举例了,还是流行的。你也举个例子啊,让我学习学习
【 在 z16166 的大作中提到: 】
: 你试图用某几个项目没有使用异常,来证明异常不靠谱,这本身是个错误的推理。
: 因为按你这个推理,只有100%的项目都使用了异常,才能证明异常是靠谱的。
:
: ...................
--来自微微水木3.5.14
--
FROM 39.144.106.*
最基础的就是stl,
boost、opencv、jsoncpp、Poco、ChakraCore、facebook folly、 C++/WinRT、curlpp(libcurl的c++封装)、Apache MXNet、pybind11(被pytorch使用)、cppzmq(zmq的c++封装)、LibreOffice
【 在 foliver 的大作中提到: 】
: 那你就告诉我,那些项目使用了异常?
: 我好歹举例了,还是流行的。你也举个例子啊,让我学习学习
--
FROM 222.128.162.*
c++的异常有缺陷?
那么java,c#的异常没有缺陷?
分跟谁比了
【 在 foliver 的大作中提到: 】
: 为啥游戏不能用异常,虚幻自带了反射系统,这个消耗不大?你这是自相矛盾。
: 再给你一个LLVM的编码标准
: Do not use RTTI or Exceptions
: ...................
--
FROM 221.219.211.*