Visual Studio中try catch()还未执行,throw后便报错

问题来源于《数据结构、算法与应用C++描述》一书中 ++1.3 异常++ 中的++程序1-8++ 和++程序1-9++。

0·throw抛出异常后怎么处理。

0·1·小方框右上角有一个绿色倒三角▲(继续执行)

这个小方框报出的异常是可以继续执行的。你可以理解为编译器没有经过调教而主动弹出异常,作为一个提醒,然后需要你手动点击继续;等调教过后就不会弹出异常了,它会自动跳过。(往后看)

1·调教编译器(

代码1:

cpp 复制代码
//程序1-8
#include <iostream>
using namespace std;
#include <stdlib.h>
int abc(int a, int b, int c) {
		if (a <= 0 || b <= 0 || c <= 0) {
			throw "All parameters should be > 0";
		}
		return (a + b * c);
	}
//程序1-9
int  main() {
	double z = 0;
	try {
		cout << abc(2, 0, 1) << endl;
	}
	catch (/*const */char* e) {
		cout << "The parameters to abc were 2,0,and 4" << endl;
		cout << "An exception has been thrown" << endl;
		cout << e << endl;
		return 1;
	}
	return 0;
}

代码如上↑↑↑

结果如下↓↓↓(错误结果)​​​​​​​1·1·在查找解决方案的时候试过了很多,如链接一给出的:命令行添加/EHa。可惜的是,命令行根本没法输入;即便底部的编辑栏可以输入,但仍然无效。

顺着/EHa可以查到链接二里的方法。

连接一: vs开发,添加try catch(...)发现没有捕获异常,需要对编译命令进行设置_vs 2019 c++ try catch 无效-CSDN博客

链接二:vs中/EHa、/EHs、/EHsc的区别_ehsc eha-CSDN博客

可惜的是依旧没有用。

1·2·问题出在哪?这个问题这么小众吗?我想过会不会是vs2022版本较新,不支持try-catch了。好家伙,考古到了06年的残卷。又有新思路了------编译器优化的原因。

链接三:求救:try{}catch(...){} 在 Release 版本下失效-CSDN社区

1·3·如果我换一个函数,编译器也会优化吗?(除数为零)

链接四:C++ 异常处理 | 菜鸟教程

代码2:

cpp 复制代码
#include <iostream>
using namespace std;

double division(int a, int b)
{
	if (b == 0)
	{
		throw "Division by zero condition!";
	}
	return (a / b);
}

int main()
{
	int x = 50;
	int y = 0;
	double z = 0;

	try {
		z = division(x, y);
		cout << z << endl;
	}
	catch (const char* msg) {
		cerr << msg << endl;
	}

	return 0;
}

此时你会发现,代码1和代码2的throw后跟的同样是字符串,代码2中的catch(const char* msg)与catch(char* e)不完全一样。

结果是:代码2能够正常抛出异常,代码1不能。这说明throw "Division by zero conditionS";双引号里的内容是const char* 型。

原因:const char* msg是指向常量的指针;char* e是指向变量的指针。(参考链接五)

链接五:char *与const char* 的区别_const char*和char*的区别-CSDN博客

1·4·至此已经能得到预期的结果了。但还有一个小问题,就是能不能让编译器跳过上面左图弹出异常、点击继续这一步,直接给出上面右图结果呢?当然可以。

当编译器抛出异常时,将最下面KernelBase.dll勾选上就行了。这样点击运行后,便会直接给出运行结果,也即catch块的内容。

2·小结

1·4·这一步,我感觉有点多余,因为可以把抛出异常导致的程序暂停是正常暂停,不是非正常暂停,也不是程序终止。暂停告诉你程序出错,不然为什么叫:抛出异常呢。

但是但是,话又说回来,怎么给我抛到return 上了???我总以为是格式不规范导致的。。。如果你正常暂停我就知道错误处在哪里的话,那我还要catch()块干什么?所以还是别中途抛出异常好了。

相关推荐
wuyk5556 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无6 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
波特率1152006 小时前
C++新特性---属性说明符与标准属性
开发语言·c++
不会代码的小猴6 小时前
3. 控件学习1
开发语言·c++·笔记·qt·算法
烧酒同学11 小时前
【C++】记录size of std::vector的巧妙坑
开发语言·c++·图形渲染
@呱呱爱学习13 小时前
C++大成之路_ STL容器_ Vector
开发语言·c++
码匠许师傅14 小时前
【C++ 面试真题】19. 聊聊 C++ 的迭代器
开发语言·c++·面试
qeen8714 小时前
【数据结构】红黑树的算法原理解析与实现
开发语言·数据结构·c++·算法·红黑树
码匠许师傅15 小时前
【C++ 面试真题】20. 聊聊 C++ 的标准库常用算法
c++·算法·面试
白色冰激凌16 小时前
[SECS/GEM研究] (六)SML与数据序列化
c++·secs/gem