- 主题:异常这玩意儿当初是哪个脑残发明出来的?
自己查资料,哈哈
【 在 hgoldfish 的大作中提到: 】
: 对了,我也没有看过。之前在本版有提到过, amd65 架构下使用下使用查表实现。那么应该是 throw 没有开销,catch 也没有开销,但 try 有开销吧?
: 另外, i386, arm32 和 arm65 架构下的开销不知道怎么样呢?
:
--
FROM 221.218.161.*
这就是对应人类生活啊,
有一类人类生活是哪一层有问题,哪一层自己解决。
还有一类人类生活是自己私下沟通一下,不要捅到大老板那里去了。
还有一位是大老板在旁边看着,任何一个出问题,他都要插手处理
--
FROM 223.104.40.*
不同理念和解决办法了
golang的 各种err返回值 也不是照样被骂
总是有所取舍的
【 在 speedboy2998 的大作中提到: 】
: 污染性太强了。。。
: 老老实实地判断返回值不好好的吗?
--
FROM 223.104.40.*
你的思维,还局限在c的面向过程,而cpp是面向对象编程,异常作为一个对象,可以携带更多的信息。(当然,也允许只抛出一个整数或者字符串)
在编码的层次上,返回值可以被忽略,而抛出的异常则不可,这减少了提交给用户的产品出错的概率
一个函数(或者模块)抛出了一个异常,处理这个异常的代码可以调用栈中的几级以外,就是说,这期间众多的调用过程,根本无需处理异常,而你的‘返回值机制’呢?
【 在 speedboy2998 的大作中提到: 】
: 污染性太强了。。。
: 老老实实地判断返回值不好好的吗?
--
FROM 223.101.194.*
异常这个东西偶尔用一次挺n爽的,铺开了用就是恶梦。
【 在 z16166 的大作中提到: 】
: 你说得有些道理
: 不过所有人都不舒适未必是事实,比如已经在用异常的那些人(但不是滥用)
: 还有种可能是有些问题也许就没有很简便的解决办法,类似Rust搞的那些用来解决c++没很好地解决的问题而引入的特性,c++码农刚接触这些特性时可能也会觉得处处受掣肘,很不爽,连个双向链表都搞不出来。越过这个阶段后会好很多。
: ...................
--
FROM 117.147.21.*
这应该是C++的难言之隐,在当初把语言设计为 构造函数不能返回错误时,就决定了C++离不开异常。
--
FROM 111.164.179.*
这个问题也有另外一个答案。
其实我一直主张值语义。因为原始类型除了 flaot/double 没有 null 这语义,没道理给复杂对象类型都弄个这个语义。
有没有 null,应该由对象自己决定。比如 string 类型,内部指针是空指针的时候就是 null,和 0 长度的字符串区别开。
或者像 socket 类型,没连接 fd 无效的时候就是空 socket.
如果是这样的话,那构造函数抛异常也不需要了。
【 在 zhongjianguo 的大作中提到: 】
: 这应该是C++的难言之隐,在当初把语言设计为 构造函数不能返回错误时,就决定了C++离不开异常。
--
FROM 120.36.160.*
上面的人都在说C++的异常。要说早期语言,Ada 83就有异常了,而且Ada 83是没有面向对象和RAII的。
设计异常机制的目的Rationale有讲。
【 在 speedboy2998 的大作中提到: 】
: 污染性太强了。。。
: 老老实实地判断返回值不好好的吗?
--
修改:ArchLinux FROM 114.254.1.*
FROM 114.254.1.*
说得好,但是有一个不解。
如果异常跳出了好几层函数,中间层new出的对象,是否都能析构呢?
如果都自动析构,如果抛的信息含有这些内容呢?
【 在 e729 的大作中提到: 】
: 你的思维,还局限在c的面向过程,而cpp是面向对象编程,异常作为一个对象,可以携带更多的信息。(当然,也允许只抛出一个整数或者字符串)
: 在编码的层次上,返回值可以被忽略,而抛出的异常则不可,这减少了提交给用户的产品出错的概率
: 一个函数(或者模块)抛出了一个异常,处理这个异常的代码可以调用栈中的几级以外,就是说,这期间众多的调用过程,根本无需处理异常,而你的‘返回值机制’呢?
: ...................
--
修改:ylh1969 FROM 221.218.62.*
FROM 221.218.62.*
在抛出异常后调用栈内存对象的析构函数,在C++标准里有规定
正是因为 stack unwinding 的保证作为基础,才有了我们所熟知的 RAII 技术。
另外可以注意到,如果在 stack unwinding 期间抛出异常呢?就只能调用 std::terminate
【 在 ylh1969 的大作中提到: 】
说得好,但是有一个不解。
如果异常跳出了好几层函数,中间层new出的对象,是否都能析构呢?
如果都自动析构,如果抛的信息含有这些内容呢?
【 在 e729 的大作中提到: 】
: 你的思维,还局限在c的面向过程,而cpp是面向对象编程,异常作为一个对象,可以携带更多的信息。(当然,也允许只抛出一个整数或者字符串)
: 在编码的层次上,返回值可以被忽略,而抛出的异常则不可,这减少了提交给用户的产品出错的概率
: 一个函数(或者模块)抛出了一个异常,处理这个异常的代码可以调用栈中的几级以外,就是说,这期间众多的调用过程,根本无需处理异常,而你的‘返回值机制’呢?
: ...................
--
修改:ABCDEFGHJKLM FROM 114.253.35.*
FROM 114.253.35.*