- 论坛徽章:
- 2
|
回复 16# starwing83
我记得原文是在说C++里异常怎样怎样。 不记得有没有提到C++的异常与C交互会怎样这样。
不过既然被提到了于是想指出高级控制流程与C交互的问题不是C++独有的。 反而C++里处理这个问题还算比较容易的。 如果后续有人想以此作为理由喷C++完全是站不住脚的。
当然如果还要人想继续无脑喷。。。 面子是别人给的而脸是自己丢的。
至于C++本身里的异常怎样怎样。。。 都没那个心情讨论了。。。 都什么年代了还在讨论C++异常。。。 又不是什么新鲜和高级玩意。。。
换种说法是我有心情讨论的对谈异常变色的人来说完全是黑魔法了。。。 鸡同鸭讲。。。
抛开C++异常本身。 不管是10年左右那篇博客还是现在, 我瞧不起并且以前会去喷而现在没那个精力的是这样一类人。
他们真是被各种自己搞不懂的玩意给吓傻了。 随后采取的态度不是真正静下心用自己的大脑去分析而是找各种“Liuns怎么说”、“Google怎么看”并以此来安慰与逃避自己的无能。
而且Linus的话语本身。。。 说好听叫富有感染力说难听就是也就是喷。。。Linus和Google的始终是他们在他们自己的情况下采取的做法而不是普适的。 对放弃自我思考而将这种权利托付给他人的人。。。 多说无益。。。
对单一或者参考实现来说。 Ruby,Python,Lua里的高级控制流程可以与C很方便的交流?
比如 "R/P/Lf -> C -> R/P/Lg" 。 R/P/Lg里非局部向上不可逆跳转可以直接绕过C到R/P/Lf?
那具体到某个C++实现的时候 "C++f -> C -> C++g" 是否可以做到C++g抛出的异常不经过特殊处理直接在C++f里抓取到?
我不知道具体答案。 但我觉得这样的比较才是公平的。
对多种实现来说。 {J,Iron} x {Ruby,Python,Lua} 的组合 "R/P/Lf -> J/Iron -> R/P/Lg" 里 R/P/Lg 抛出的“异常”能被R/P/L/f 接住是应该的。 因为J/Iron里本身就有异常。
而{C,J,Iron} x {Ruby,Python,Lua} 的组合 "R/P/Lf -> C -> R/P/Lg" 里 R/P/Lg 抛出的异常要被 R/P/Lf 接住? 而不需要在g里抓取所有然后转换成状态码返回给C?
这对J,Iron啥啥的来说又有点不公平。 谁让C++有许多native实现呢。
至于C++有这么多实现是不是好事我也没有明确观点。 但因为它的选择多了于是不能在写出在所有实现里都能直接向模块外抛异常而批评异常我依然觉得这不公平。
我也赞同“跨边界用异常是作死”的观点。 除非宿主环境本身就支持。
我也不知道“标准”到底应该怎么定义。
C++的各种实现和在它的宿主环境交互的时候都有很一致的做法。 比如#include后就可以将C的各种库拿来用。extern "C" 将class/struct包在struct甚至是一个struct*里并实现一些包装函数把异常全部转换成状态码, 将模板具现化之后C++实现的库又可以在C里用。
Ruby,Python,Lua在JVM和.net上的各种实现是否只是有相同的语法甚至相近的语义但在访问宿主环境时就有区别了?
反正Clojure{JVM,JS,dotNET}是这样。 区别不多但就是存在。 而且最麻烦的是宿主环境里的各种库根本就不一样。 我相信这点上R/P/L在JVM和dotNET的实现也是一样的。
C++的各种主流实现是为了在同一个宿主环境下使用而它们是为了在不同的宿主环境下使用。
PS: silj是什么? LuaJIT 里 f -> C -> g 。 g里面可以直接error,yield什么的到f? |
|