关于异常处理的问题 代码两行

operatingtuzi 2009-02-14 03:16:18
现在在看书自学,看到异常处理的时候书上没什么例子 不太理解。
书上给了很多可能出现的异常类型。
我想问 :1 .既然大多数异常能进行的操作就只有what()输出,为什么要定义那么多异常类型?
2. 猜想第一个问题的答案,有这么多类型是不是因为每种只有在throw了他那种异常时,才能够catch到?
3. 我写了一个出现异常的例子,但是不管我用什么异常类型去catch,都没有阻止在运行时中断,为什么呢?难道没有对应这种情况的异常吗?运行时候的提示框 是不是调用terminate的结果?
代码如下
请输入超过3个的字符

char a[4];
try{
cin>>a;
//throw runtime_error("over");
}catch(overflow_error err)
{
cout<<err.what();
}
catch(runtime_error err)
{
cout<<err.what();
}
...全文
127 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
operatingtuzi 2009-02-15
  • 打赏
  • 举报
回复
不是异常?那这种情况就不能catch了吗 不能我自己来处理吗
tangshuiling 2009-02-14
  • 打赏
  • 举报
回复

超过4个字符,是引发了栈检测函数checkstack()而非楼主认为的异常!(至少vs2005就是如此)
baihacker 2009-02-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 operatingtuzi 的回复:]
补充一下,说错了,应该是输入超过4个字符。
因为定义的时候是char a[4];
[/Quote]
a会被弱化为指针,在输入多的时候会覆盖主调函数的ebp,当前函数的返回现场.

operatingtuzi 2009-02-14
  • 打赏
  • 举报
回复
一楼误解我的意思了

那段throw我已经注释掉了。如果throw一个runtime error当然会catch到了

我想问的是:
当输入一个大小超界的字符串时,编译器会弹出提示,说栈破坏什么的。。
我想捕获这个异常,让我自己处理,而不是让编译器显示出错信息并中断程序
nineforever 2009-02-14
  • 打赏
  • 举报
回复
C++本身并不能catch访问越界。而且访问越界的行为是未定义的,并不一定会触发异常
另外,VC里开了SEH才能捕获内存访问错误
operatingtuzi 2009-02-14
  • 打赏
  • 举报
回复
补充一下,说错了,应该是输入超过4个字符。
因为定义的时候是char a[4];
great3779 2009-02-14
  • 打赏
  • 举报
回复
我一般喜欢定义自己的异常处理类。主要是自己懒,不愿意去记那些标准异常。


#include <iostream>
using namespace std;

class CMyException
{
public:
CMyException()
{
m_nErrLn = 0;
m_strReason = "";
}

CMyException(string str, int nLine)
{
m_strReason = str;
m_nErrLn = nLine;
}

~CMyException()
{
;
}

public:
string m_strReason;
int m_nErrLn;
};

void main()
{
char a[4];
try
{
int* pPointer = NULL;

if(pPointer == NULL)
throw CMyException("Pointer is NULL", __LINE__);

*pPointer = -1;
}

catch(const CMyException& excpt)
{
cout<<excpt.m_strReason.c_str()<<endl;
cout<<excpt.m_nErrLn<<endl;
}
catch(...)
{
cout<<"UnKnown Error";
}

system("pause");
}
baihacker 2009-02-14
  • 打赏
  • 举报
回复
1 .既然大多数异常能进行的操作就只有what()输出,为什么要定义那么多异常类型? 

有可能只捕获指定异常

2. 猜想第一个问题的答案,有这么多类型是不是因为每种只有在throw了他那种异常时,才能够catch到?
注意类型

3. 我写了一个出现异常的例子,但是不管我用什么异常类型去catch,都没有阻止在运行时中断,为什么呢?难道没有对应这种情况的异常吗?运行时候的提示框 是不是调用terminate的结果?

捕获不到就用catch(...)

char a[4];
try{
cin>>a;
throw runtime_error("over");
}catch(overflow_error err)
{
cout<<err.what();
}
catch(runtime_error err)
{
cout<<err.what();
}
d:\>a
123
over
d:\>a
454325432
over

65,210

社区成员

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

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