c++类的成员函数中throw异常,程序崩溃

HouGISer 2017-11-15 08:59:46
我想请问在c++自定义类的成员函数中,throw一个异常,比如就是“error”,在main函数中用catch(const char * error){cout<<error;}
程序为什么会自动崩溃?
...全文
577 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2017-11-20
  • 打赏
  • 举报
回复
项目-》设置-》启用c++异常
HouGISer 2017-11-20
  • 打赏
  • 举报
回复
引用 13 楼 zjq9931 的回复:
[quote=引用 12 楼 lyandgh 的回复:] 我在vs2013中用同样的代码测试,同样会崩溃
电脑上没有装2013,用2010验证了一遍也是正常的,难道就2013有问题?或者编译设置之类的问题?[/quote] 额,这么背啊。。
  • 打赏
  • 举报
回复
引用 12 楼 lyandgh 的回复:
我在vs2013中用同样的代码测试,同样会崩溃
电脑上没有装2013,用2010验证了一遍也是正常的,难道就2013有问题?或者编译设置之类的问题?
paschen 版主 2017-11-16
  • 打赏
  • 举报
回复
引用 3 楼 lyandgh的回复:
[quote=引用 1 楼 paschen 的回复:] 没代码不知道,检查你抛出异常的操作有没包含在try块里,检查你抛出的异常是否是对应类型,可以先用rry(...)试下能不能接收到,如果能接收到,说明可能类型不对
代码大致是这样的

class A{
void fun(const char* filename){
ifstream m;
m.open(filename);
if(!m.is_open()){
throw "error";
}
...
m.close();
}
}
int main(){
A a;
try{
a.fun("C:\\1.txt");
}catch(const char*error){
cout<<error<<endl;
return 1;
}
return 0;
}
请看看问题出在哪里?[/quote] 从你代码看如果抛出异常是应该会接收到的,你检查是否满足了if条件,也可能你程序崩溃是其他地方代码造成的,并不是这里抛出没接收到导致的
赵4老师 2017-11-16
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
HouGISer 2017-11-16
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
没代码不知道,检查你抛出异常的操作有没包含在try块里,检查你抛出的异常是否是对应类型,可以先用rry(...)试下能不能接收到,如果能接收到,说明可能类型不对
代码大致是这样的

class A{
void fun(const char* filename){
ifstream m;
m.open(filename);
if(!m.is_open()){
throw "error";
}
...
m.close();
}
}
int main(){
A a;
try{
a.fun("C:\\1.txt");
}catch(const char*error){
cout<<error<<endl;
return 1;
}
return 0;
}
请看看问题出在哪里?
HouGISer 2017-11-16
  • 打赏
  • 举报
回复
代码大致是这样的

class A{
void fun(const char* filename){
ifstream m;
m.open(filename);
if(!m.is_open()){
throw "error";
}
...
m.close();
}
}
int main(){
A a;
try{
a.fun("C:\\1.txt");
}catch(const char*error){
cout<<error<<endl;
return 1;
}
return 0;
}
请看看问题出在哪里?
HouGISer 2017-11-16
  • 打赏
  • 举报
回复
引用 11 楼 zjq9931 的回复:
验证下面的程序在VS2015上是可以正常捕获到异常并输出的。

#include <iostream>
#include <fstream>

using namespace std;

class A 
{
public:
	void fun(const char* filename) 
	{
		ifstream m;
		m.open(filename);
		if (!m.is_open()) 
		{
			throw "error";
		}
		else 
		{
			m.close();
		}
	}
};

int main() 
{
	A a;
	try 
	{
		a.fun("C:\\1.txt");
	}
	catch (const char*error) 
	{
		cout << error << endl;
		return 1;
	}
	return 0;
}
我在vs2013中用同样的代码测试,同样会崩溃
jena_wy 2017-11-16
  • 打赏
  • 举报
回复
检查一下文件是否存在,不存在会崩溃。
HouGISer 2017-11-16
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
[quote=引用 3 楼 lyandgh的回复:][quote=引用 1 楼 paschen 的回复:] 没代码不知道,检查你抛出异常的操作有没包含在try块里,检查你抛出的异常是否是对应类型,可以先用rry(...)试下能不能接收到,如果能接收到,说明可能类型不对
代码大致是这样的

class A{
void fun(const char* filename){
ifstream m;
m.open(filename);
if(!m.is_open()){
throw "error";
}
...
m.close();
}
}
int main(){
A a;
try{
a.fun("C:\\1.txt");
}catch(const char*error){
cout<<error<<endl;
return 1;
}
return 0;
}
请看看问题出在哪里?[/quote] 从你代码看如果抛出异常是应该会接收到的,你检查是否满足了if条件,也可能你程序崩溃是其他地方代码造成的,并不是这里抛出没接收到导致的[/quote] 满足条件的,我调试的时候进入if{}在throw那一句崩溃了,vs2013停止并重启。
HouGISer 2017-11-16
  • 打赏
  • 举报
回复
引用 5 楼 baidu_37097818 的回复:
fun函数需要是public
是public的,我没写上去。调试的时候,在执行throw那条语句的时候,vs2013就停止然后重启。
开心秋水 2017-11-16
  • 打赏
  • 举报
回复
fun函数需要是public
  • 打赏
  • 举报
回复
验证下面的程序在VS2015上是可以正常捕获到异常并输出的。

#include <iostream>
#include <fstream>

using namespace std;

class A 
{
public:
	void fun(const char* filename) 
	{
		ifstream m;
		m.open(filename);
		if (!m.is_open()) 
		{
			throw "error";
		}
		else 
		{
			m.close();
		}
	}
};

int main() 
{
	A a;
	try 
	{
		a.fun("C:\\1.txt");
	}
	catch (const char*error) 
	{
		cout << error << endl;
		return 1;
	}
	return 0;
}
paschen 版主 2017-11-16
  • 打赏
  • 举报
回复
引用 7楼lyandgh 的回复:
[quote=引用 4 楼 paschen 的回复:] [quote=引用 3 楼 lyandgh的回复:][quote=引用 1 楼 paschen 的回复:] 没代码不知道,检查你抛出异常的操作有没包含在try块里,检查你抛出的异常是否是对应类型,可以先用rry(...)试下能不能接收到,如果能接收到,说明可能类型不对
代码大致是这样的

class A{
void fun(const char* filename){
ifstream m;
m.open(filename);
if(!m.is_open()){
throw "error";
}
...
m.close();
}
}
int main(){
A a;
try{
a.fun("C:\\1.txt");
}catch(const char*error){
cout<<error<<endl;
return 1;
}
return 0;
}
请看看问题出在哪里?[/quote] 从你代码看如果抛出异常是应该会接收到的,你检查是否满足了if条件,也可能你程序崩溃是其他地方代码造成的,并不是这里抛出没接收到导致的[/quote] 满足条件的,我调试的时候进入if{}在throw那一句崩溃了,vs2013停止并重启。[/quote]throw (const char*)“error”试下
paschen 版主 2017-11-15
  • 打赏
  • 举报
回复
没代码不知道,检查你抛出异常的操作有没包含在try块里,检查你抛出的异常是否是对应类型,可以先用rry(...)试下能不能接收到,如果能接收到,说明可能类型不对

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧