程序调试与异常处理

来源:互联网 发布:mac电脑excel换行 编辑:程序博客网 时间:2024/05/17 00:55

1.程序分为Debug版本和Release版本:Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

2.【生成解决方案】命令让Visual Studio 2005编译各个源文件,并将它们链接成为.exe文件或其他形式的程序文件。

3.【重新生成解决方案】这个命令让编译器重新编译所有源文件,即使这些文件没有被修改过。

4..【清理解决方案】命令用于清除解决方案在以前生成可执行文件时产生的旧文件。

5.只有在程序挂起的时候才能添加监视等功能。

6.调用堆栈:调用堆栈反映了当前断点处函数是被哪些函数按照什么顺序调用的。在调用堆栈对话框中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。单击这些函数名可以跳到对应的函数中去。

7.try throw catch异常处理。try块将检测以下三个函数中是否有抛出的异常。

Throw抛出异常,catch找到异常后的处理。

8.如果没有异常发生,则执行try块中的代码,和try块相关联的处理代码catch被忽略。

9.需要注意的是try块可以包含任何C++语句表达式以及声明,一个try块引入一个局部域,在try块内声明的变量不能在try块外被引用,包括在catch子句中。

10.当某条语句抛出异常时,跟在该语句后面的语句将被跳过,程序执行权被转交给处理异常的catch子句。

11.程序异常类举例:

  class NumberExc

{

public:

NumberExc(int _excNum)

{

errorNum = _excNum;

cout<<"捕获到异常"<<endl;

}

void proExc()

{

switch(ExcNum)

{

case 0:

cout<<"除数为0"<<endl;

break;

case 1:

cout<<"数字过大"<<endl;

break;

case 2:

cout<<"数字过小"<<endl;

break;

}

}

int ExcNum;

};

void TestFunction1(int ival)

{

if(ival>1000)

throw NumberExc(1);

}

void TestFunction2(int ival)

{

if(0 == ival)

throw NumberExc(0);

}

void TestFunction3(int ival)

{

if(ival<0)

throw NumberExc(2);

}

int main()

{

try

{

TestFunction1(13);

TestFunction2(0);

TestFunction3(16);

}

catch(NumberExc ne)

{

ne.proExc();

}

return 0;

}

12.代码如下:

      //#include "Utility.h"

//

///*

//C++中的异常处理:

//    一般情况下,我们对于程序中可以预知,但无法避免的潜在错误

//进行异常处理操作。

//

//关键字:try、throw、catch

//格式:

//try

//{

//可能抛出异常的代码段,这里应该包含   if()    throw  XXX ;

//}

//catch(异常类型1)

//{

//对异常类型1的处理代码

//}

//catch(异常类型2)

//{

//对异常类型2的处理代码

//}

//catch(...)

//{

//catch序列中没有被处理的任何异常类型进行处理

//}

//*/

//

enum Exception_Type{ET_ZERO,ET_TOOBIG,ET_TOOSMALL};

 

class CException

{

public:

Exception_Type m_Type;

public:

CException(Exception_Type _type):m_Type(_type)

{

cout<<"异常处理类..."<<endl;

}

void processExc()

{

switch(m_Type)

{

case ET_ZERO:

cout<<"除数为0"<<endl;

break;

case ET_TOOBIG:

cout<<"数据过大"<<endl;

break;

case ET_TOOSMALL:

cout<<"数据过小"<<endl;

break;

}

}

};

void main()

{

try

{

cout<<"请输入2个整型数据,介于0.0f-10.0f之间,第二个数据不能为0:";

float fValue1 = 0.0f;

float fValue2 = 0.0f;

cin>>fValue1>>fValue2;

if( fValue1 < 0.0f || fValue2 < 0.0f)

throw CException(ET_TOOSMALL );

else if(fValue1 > 10.0f || fValue2 > 10.0f)

throw CException(ET_TOOBIG );

// 浮点数与0的比较方式:

else if( abs( fValue2 -0.0f ) < 0.00001 )

throw CException(ET_ZERO);

}

catch(CException obj)

{

obj.processExc();

}

catch(char * pStr)

{

cout<<"捕获到的异常为:"<<pStr<<endl;

}

catch(...)

{

cout<<"未知异常,请自行查代码解决......"<<endl;

}

system("pause");

}

//---------多级多层异常处理---------

#include "Utility.h"

void TestFunc()

{

//内层try中可能被抛出的异常优先调用内层catch

//序列进行处理如果内层catch序列无法处理该异常,

//向外层的catch序列传递该异常

try

{

cout<<"TestFunc Called..."<<endl;

throw "我是TestFunc中被抛出的异常";

}

catch ( int )

{

}

}

void main()

{

try

{

TestFunc();

}

catch ( char * pStr)

{

cout<<"Main中的catch序列捕获到异常:";

cout<<pStr<<endl;

}

//注意...的用法:一般...出现在最外层

//的catch序列的“最后”

catch (...)

{

}

system("pause");

}

0 0
原创粉丝点击