悲伤的 C++ throw(…)
当在C++语言中引入异常时,引入了相应的throw(…)动态异常说明符,注释了哪些异常可以由函数抛出。比如:
// this function might throw an integer or a pointer to char,
// but nothing else.
void foo() throw(int, char*);
这让很多人非常愤怒,并被普遍认为是一个糟糕的举动。
微软C++编译器将throw(…)异常说明符视为程序员的一个允诺,但没有强制执行。它相信你会遵守你自己强加的合同。如果在函数承诺不抛出异常时抛出异常,则行为是未定义的。如果函数说可以抛出一些异常,编译器不会验证是否允许实际抛出的异常;它只是传播异常。实际上,发生的情况是编译器在假定不会引发不允许的异常的情况下执行优化。最常见的这种优化是,编译器不必为它“知道”永远不需要展开的事情注册展开代码,因为在对象销毁之前,没有可能抛出异常的点。
void Example()
{
ObjectWithDestructor obj;
obj.stuff_that_does_not_throw();
// destructor runs here
}
如果stuff_
that_
does_
not_
throw
被标记为不抛出,那么编译器可以避免在异常传播期间注册obj进行展开,因为您承诺任何异常都不能逃逸。然后抛出异常并使所有优化无效。最常见的可见效果是,从不应该让异常转义的函数传播的异常,以及某些对象析构函数无法运行。
但是等等,一切都没有失去。如果启用/std:c++17
,那么微软C++编译器将实现throw(…)的标准行为。
是的,到那儿花了很长时间,但迟到总比不到好。
悲伤的 C++ throw(…)的更多相关文章
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- C++异常处理:try,catch,throw,finally的用法
写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...
- java中的throw与throws的区别
什么时运行时异常?什么是非运行时异常? 通俗的讲: 运行时异常:就是编译通过,运行时就崩了,比如数组越界. 非运行时异常:就是编译不通过,这时就得必须去处理了.不然就没法运行了. 全面的讲: Thro ...
- js 利用throw 写的一个小程序
在下边的小程序中比较特殊的是使用isNaN()函数判断一个参数是不是数字, <!DOCTYPE html> <!DOCTYPE html> <html> <h ...
- C++异常处理: try,catch,throw,finally的用法
写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...
- Java 中 手动抛出异常: throw new Exception("错误信息") 错误信息的获得
当然需要先用try catch捕获,但注意new Exception("")括号里的字符串其实是异常原因,所以获取是要用ex.getCause().getMessage() int ...
- throw exception
Throw new CustomerException('Customer message'); // App\Exceptions\Handler.php public function rende ...
- try{}、catch(){}、throw语句
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析与解决方法
对于C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析,目前本人分析两种情况,如下: 情况一: 借鉴麒麟.NET ...
随机推荐
- appium 方法整理
1.contexts contexts(self): Returns the contexts within the current session. 返回当前会话中的上下文,使用后可 ...
- Codeforces Round #499 (Div. 1) F. Tree
Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...
- Java字节码扩展
异常表 代码一: public class Test03 { public void test() { try { InputStream is = new FileInputStream(" ...
- 正在阅读的tex教程
https://liam.page/2014/09/08/latex-introduction/ https://www.jianshu.com/p/1d99b3c883a6 http://www.c ...
- KIP-382: MirrorMaker 2.0
Status Motivation Public Interfaces Proposed Changes Remote Topics, Partitions Aggregation Cycle det ...
- jedis异常:Could not get a resource from the pool
前几天公司后端系统出现了故障,导致app多个功能无法使用,查看日志,发现日志出现较多的redis.clients.jedis.exceptions.JedisConnectionException: ...
- C#字符串连接问题(包含破折号和引号)
1.需求场景: 生成字符串如下:jsonStr.Append("\"SensorTypes\":"); 解决方法: string code = @"j ...
- 如何使用Git 优雅的版本回退呢?
在版本迭代开发过程中,相信很多人都会有过错误提交的时候(至少良许有过几次这样的体验).这种情况下,菜鸟程序员可能就会虎驱一震,紧张得不知所措.而资深程序员就会微微一笑,摸一摸锃亮的脑门,然后默默的进行 ...
- aria2 资料
https://www.jianshu.com/p/8124b5b6ef95https://quan.ithome.com/0/331/853.htmhttp://www.360doc.com/con ...
- TypeScript编写Vue项目结构解析
使用TypeScript编写Vue项目也已经有了一段时间,笔者在刚刚使用TypeScript时候也是很茫然,不知道从何下手,感觉使用TypeScript写项目感觉很累赘并不像JavaScript那么灵 ...