异常处理问题
我把一个a.h头文件加载在mfc工程中a.h文件中有个fun()函数我就是想如果fun()函数出现异常就弹出一个messagebox窗口这个该怎么弄,需要什么文件吗,大概...
我把一个a.h头文件加载在mfc工程中
a.h文件中有个fun()函数
我就是想如果fun()函数出现异常就弹出一个messagebox窗口
这个该怎么弄,需要什么文件吗,大概的解说一下,谢谢。。。 展开
a.h文件中有个fun()函数
我就是想如果fun()函数出现异常就弹出一个messagebox窗口
这个该怎么弄,需要什么文件吗,大概的解说一下,谢谢。。。 展开
2个回答
展开全部
C的异常处理是try……throw……catch……结构。需要抛出异常,即throw语句
try
{
float c=a/b;
} 改成
try
{
if(b==0)throw;
float c=a/b;
}
C++语言提供对处理异常情况的内部支持,异常情况即是所知道的“异常”,可能在你的程序执行期间出现。
try、throw和catch语句已被加到C++语言中去实现异常处理。有了C++异常处理,你的程序可以向更高的执行上下文传递意想不到的事件,这些上下文能更好地从这些异常事件中恢复过来。这些异常由正常控制流外的代码进行处理。Microsoft C++编译器朝着C++进化中的标准去实现基于ISO WG21/ANSI X3J16工作文件的C++异常处理模式。
语法
try块:
try复合语句 处理器表
处理器表:
处理器 处理器表opt
处理器:
catch(异常说明) 复合语句
异常说明:
类型指示符表 说明符
类型指示符表 抽象说明符
类型指示符表
...throw-表达式:
throw 赋值表达式opt
try子句后的复合语句是代码的保护段。throw表达式“丢弃”(凸起)一个异常,catch子句后的复合语句是异常处理器,“捕获”(处理)由 throw表达式丢弃的异常。异常说明语句指示子句处理的异常的类型,类型可以是任何有效的数据类型,包括C++的类。如果异常说明语句是一个省略号 (...),catch子句处理任何类型的异常,包括C的异常。这样的处理器必须是其try块的最后一个处理器。
throw的操作数语法上与return语句的操作数相似。注意:Microsoft C++不支持函数throw特征机制,如ANSI C++草案的15.5节所描述的。此外,它也不支持ANSI C++草案的15节中描述的function-try-block。执行过程如下:
1. 控制通过正常的顺序执行到达try语句,保护段(在try块内)被执行。
2. 如果在保护段执行期间没有引起异常,跟在try块后的catch子句不执行。从异常被丢弃的try块后跟随的最后一个catch子句后面的语句继续执行下去。
3. 如果在保护段执行期间或在保护段调用的任何例行程序中(直接或间接的调用)有异常被丢弃,则从通过throw操作数创建的对象中创建一个异常对象(这隐含指可能包含一个拷贝构造函数)。在此点,编译器在能够处理丢弃类型的异常的更高执行上下文中寻找一个catch子句(或一个能处理任何类型异常的 catch处理器)。catch处理程序按其在try块后出现的顺序被检查。如果没有找到合适的处理器,则下一个动态封闭的try块被检查。此处理继续下去直到最外层封闭try块被检查完。
4. 如果匹配的处理器未找到,或如果在不自动分行时出现异常,但在处理器得到控制之前预定义的运行函数terminate被调用。如果一个异常发生在丢弃异常之后,则在循环展开开始之前调用terminate。
5. 如果一个匹配的catch处理器被找到,且它通过值进行捕获,则其形参通过拷贝异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化为指向异常对象,在形参被初始化之后,“循环展开栈”的过程开始。这包括对那些在与catch处理器相对应的try块开始和异常丢弃地点之间创建的(但尚未析构的)所有自动对象的析构。析构以与构造相反的顺序进行。catch处理器被执行,且程序恢复到跟随在最后的处理器之后的执行(即不是catch处理器的第一条语句或构造)。控制仅能通过一个丢弃的异常输入一个catch处理器,而永远不能通过goto语句或switch语句中的case标号。
try
{
float c=a/b;
} 改成
try
{
if(b==0)throw;
float c=a/b;
}
C++语言提供对处理异常情况的内部支持,异常情况即是所知道的“异常”,可能在你的程序执行期间出现。
try、throw和catch语句已被加到C++语言中去实现异常处理。有了C++异常处理,你的程序可以向更高的执行上下文传递意想不到的事件,这些上下文能更好地从这些异常事件中恢复过来。这些异常由正常控制流外的代码进行处理。Microsoft C++编译器朝着C++进化中的标准去实现基于ISO WG21/ANSI X3J16工作文件的C++异常处理模式。
语法
try块:
try复合语句 处理器表
处理器表:
处理器 处理器表opt
处理器:
catch(异常说明) 复合语句
异常说明:
类型指示符表 说明符
类型指示符表 抽象说明符
类型指示符表
...throw-表达式:
throw 赋值表达式opt
try子句后的复合语句是代码的保护段。throw表达式“丢弃”(凸起)一个异常,catch子句后的复合语句是异常处理器,“捕获”(处理)由 throw表达式丢弃的异常。异常说明语句指示子句处理的异常的类型,类型可以是任何有效的数据类型,包括C++的类。如果异常说明语句是一个省略号 (...),catch子句处理任何类型的异常,包括C的异常。这样的处理器必须是其try块的最后一个处理器。
throw的操作数语法上与return语句的操作数相似。注意:Microsoft C++不支持函数throw特征机制,如ANSI C++草案的15.5节所描述的。此外,它也不支持ANSI C++草案的15节中描述的function-try-block。执行过程如下:
1. 控制通过正常的顺序执行到达try语句,保护段(在try块内)被执行。
2. 如果在保护段执行期间没有引起异常,跟在try块后的catch子句不执行。从异常被丢弃的try块后跟随的最后一个catch子句后面的语句继续执行下去。
3. 如果在保护段执行期间或在保护段调用的任何例行程序中(直接或间接的调用)有异常被丢弃,则从通过throw操作数创建的对象中创建一个异常对象(这隐含指可能包含一个拷贝构造函数)。在此点,编译器在能够处理丢弃类型的异常的更高执行上下文中寻找一个catch子句(或一个能处理任何类型异常的 catch处理器)。catch处理程序按其在try块后出现的顺序被检查。如果没有找到合适的处理器,则下一个动态封闭的try块被检查。此处理继续下去直到最外层封闭try块被检查完。
4. 如果匹配的处理器未找到,或如果在不自动分行时出现异常,但在处理器得到控制之前预定义的运行函数terminate被调用。如果一个异常发生在丢弃异常之后,则在循环展开开始之前调用terminate。
5. 如果一个匹配的catch处理器被找到,且它通过值进行捕获,则其形参通过拷贝异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化为指向异常对象,在形参被初始化之后,“循环展开栈”的过程开始。这包括对那些在与catch处理器相对应的try块开始和异常丢弃地点之间创建的(但尚未析构的)所有自动对象的析构。析构以与构造相反的顺序进行。catch处理器被执行,且程序恢复到跟随在最后的处理器之后的执行(即不是catch处理器的第一条语句或构造)。控制仅能通过一个丢弃的异常输入一个catch处理器,而永远不能通过goto语句或switch语句中的case标号。
展开全部
异常是核心语言特性不是库,所以不用另外添加文件。只要你没特意去编译选项里关了异常就行。
需要改fun()的定义。
//C++中函数参数类型不能省略...这里当作int
int fun()
{
try
{
//...原来的代码。
}
catch(...) //...表示捕获所有类型的异常。如果需要指定类型,一般用引用形式,例如catch(std::exception&)。当然用到的异常类型需要声明,所以可能需要包含一些头文件,和具体异常类型有关,例如<stdexcept>里的预定义基本标准异常,<typeinfo>里的std::bad_cast、std::bad_typeid等等。
{
//...这里写弹出MessageBox的代码。
}
}
当然完全不改fun的实现也可以,要是你能受得了在每次调用fun函数手写代码try/catch调MessageBox的话……或者实现一个新的函数,在里面try/catch,然后在try块里调用fun函数。
====
[原创回答团]
需要改fun()的定义。
//C++中函数参数类型不能省略...这里当作int
int fun()
{
try
{
//...原来的代码。
}
catch(...) //...表示捕获所有类型的异常。如果需要指定类型,一般用引用形式,例如catch(std::exception&)。当然用到的异常类型需要声明,所以可能需要包含一些头文件,和具体异常类型有关,例如<stdexcept>里的预定义基本标准异常,<typeinfo>里的std::bad_cast、std::bad_typeid等等。
{
//...这里写弹出MessageBox的代码。
}
}
当然完全不改fun的实现也可以,要是你能受得了在每次调用fun函数手写代码try/catch调MessageBox的话……或者实现一个新的函数,在里面try/catch,然后在try块里调用fun函数。
====
[原创回答团]
参考资料: 原创
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询