- 主题:大家都用C++的try catch吗?
我拿异常做协程的通信方式,主要用于杀协程。
比如有个协程这么写:
try {
Timeout timeout(5.0);
// 下面一般接很多操作。而不简单一行。
return http->get(url, query);
} catch (TimeoutException &) {
qDebug() << "超时了!";
return QByteArray();
}
在以上代码,当协程执行到 http->get() 这个地方会阻塞住。因为事先注册了一个超时,所以 5 秒过后还没有返回结果,事件循环就会重新唤醒这个协程,但是抛出一个超时异常。
这个办法也被用于杀协程。比如用户点了取消按钮,我就会向所有正在运行的协程任务发送一个 CoroutineExitException 协程就会退出了。
【 在 wjhtingerx 的大作中提到: 】
: 这玩意儿把出问题的调用栈都弄没了,反倒不利于调试吧?
--
FROM 183.253.146.*
为啥 amd64 架构能做到这样。是 CPU 特别处理的吗?
arm32 和 arm64 有没有这样的区别?
【 在 z16166 的大作中提到: 】
: windows上,32位程序需要建立exception frame,64位没有建立exception frame的运行时开销,在没发生exception时是zero-cost的
--
FROM 47.243.39.*
也就是说这个是 windows 针对 PE 格式的特殊规定。
32 位不支持纯粹只是因为 32 位 windows 不支持,而不是因为什么处理器的限制是吧?
【 在 z16166 的大作中提到: 】
: 跟ABI有关
: MS针对x64规定了一套ABI,把异常处理的信息静态存储在64位PE文件的IMAGE_DIRECTORY_ENTRY_EXCEPTION这个位置的表里,里面有unwind chain。一般是编译器负责生成这个表。
: 发生异常时(比如调用RaiseException()这个OS API来抛出异常),OS可以根据这个表进行异常派发,然后可以调用和语言相关的异常处理程序,比如C++的__CxxFrameHandler3、__CxxFrameHandler4等。
: ...................
--
FROM 120.33.10.*
boost 有使用异常,但 Qt 整个库不使用异常。
【 在 z16166 的大作中提到: 】
: 你的意思是boost、qt这些库的作者都是SB吗,这两个东西是使用异常的
: 抛了异常,但是事先没提供对应的文档说明,才值得骂吧
--
FROM 36.28.59.*
数十亿行代码的项目真有?不敢相信啊!怎么管理这种工程。超出个人能力了。
【 在 yuanmo 的大作中提到: 】
: CPP大佬写的是那种千万程序员都要用的库,考虑用起来要方便,所以会精雕细琢,这当然是好的。
: 而实际开发的现实情况不是这样,作为一个制定技术规范的人,你要考虑的核心是如何在有限资源有限时间内把软件弄出来,并且各种指标要达标、要健壮、能应对千变万化的需求。
: 应届毕业生中,哪怕是985毕业的,能当场写对冒泡排序的人都是少数,90%根本就没用过异常。这就是现实。一个项目代码量经常会超过百万行,千万行甚至数十亿行都不罕见,并且这些代码绝大多数都是功能性代码,很多精雕细琢的考虑在这个时候会完全失效。如何在一个草台班子写的
: ...................
--
FROM 36.28.59.*
Qt 6 也没看他们改出异常啊。
他们哪里真的在乎低版本的兼容性?笑话,最低 C++ 标准要求 C++ 17. 连 Win7 也不兼容了。
【 在 z16166 的大作中提到: 】
: qt类的内部实现不使用异常,官方给的原因一是为了保持对低版本的兼容性,二是因为使用异常会导致库尺寸增加20%。但它提供了QException方便调用者在多线程环境下使用异常。
--
FROM 180.120.74.*