1.C++异常处理



1异常捕获案例1

#include<iostream>

#include<string>

 

usingnamespacestd;

 

//标识错误的类型

classwrong{};

 

intintdiv(inta,intb)

{

   try

   {

       if
(b == 0)

       {

           throw
10;//可以是任何对象 wrong()

       }

       intc
= a /b;

       returnc;

   }

   catch
(intdata)

   {

       cout
<<"除法异常已经处理";

       return
-1;

   }

}

 

intintdivA(inta,intb)

{

   returna
/ b;

}

 

void main()

{

   intx,y;

   cin
>>x >>y;

   try

   {

       if
(y == 0)

       {

           throw
"被除数为0";

       }

       elseif
(x == 0)

       {

           throw
"除数为0";

       }

   }

   //说明捕获的可以使字符串

   catch
(constchar
*s)

   {

       if
(strcmp(s,"被除数为0")
== 0)

       {

           cout
<<"被除数为0异常,请重新输入";

           cin
>>x >>y;

       }

       elseif
(strcmp(s,"除数为0")==0)

       {

           cout
<<"除数为0异常,请重新输入";

           cin
>>x >>y;

       }

   }

   std::cout
<< intdiv(x,y);

   cin.get();

   cin.get();

   cin.get();

}

运行结果是:

2.异常处理高级

案例:

#include<iostream>

#include<string>

 

usingnamespacestd;

 

classbox //正方体

{

public:

   box(intdata)

   {

       std::cout
<< "开始构造"
<< std::endl;

       if
(data == 0)

       {  

           //使用zero抛出异常

           zeroz1;

           z1.errorcode
= 22;

           throwz1;

       }

       elseif
(data > 0 &&data
< 100)

       {

           //注意下面是一个(),并非{}

           throw small();

       }

       elseif
(data>=100 &&data<=10000)

       {

           a
=data;

       }

       else

if
(data>10000)

       {

           //使用big抛出异常

           throwbig();

       }

       else

       {

           //使用wrong抛出异常

           throwwrong();

       }

   }

 

   //用于获得体积

   intgettiji()

   {

       returna
*a *a;

   }

   classzero{

   public:

       interrorcode;

   };

   classwrong{};

   classbig{};

   classsmall{};

private:

   inta;//变长

};

 

voidmain()

{

   try

   {

       //box newbox(0);

       //box newbox(99);

       

       //box newbox(100);

       //std::cout <<newbox.gettiji() <<
endl;

 

       boxnewbox(100000);

   }

   catch
(box::zerow)

   {

       if
(w.errorcode
== 22)

       {

           cout
<<"大小:错误编码:22:正方体长度不可以为0";

       }

       else

       {

           cout
<<"错误编码:非22号,错误:正方体长度不可以为0";

       }

   }

   catch
(box::wrong)

   {

       cout
<<"正方体长度异常";

   }

   catch
(box::big)

   {

       cout
<<"正方体长度太长";

   }

   catch
(box::small)

   {

       cout
<<"正方体长度太短";

   }

   cin.get();

}

当代码如下时,运行结果不一样:

//boxnewbox(0);

//boxnewbox(99);

       

//boxnewbox(100);

//std::cout<< newbox.gettiji() << endl;

 

boxnewbox(100000);

当前运行结果:

3内存分配异常的处理(std::nothrow)

#include<iostream>

#include<new>

usingnamespacestd;

 

struct big

{

   doubledb[200000];

};

 

//测试使用异常使得内存异常的时候仍然能够正常使用

voidmain()

{

   big
*p1, *p2;

   //使用std::nothrow让异常不抛出

   p1
=new(std::nothrow)big[1000];

 

   p2
=new(std::nothrow)big[1000];

 

   if
(p1 ==NULL
||p2 ==NULL)

   {

       cout
<<"内存分配失败";

   }

   cin.get();

}

4.内存异常

案例:

#include<iostream>

#include<string>

 

usingnamespacestd;

 

classstudent

{

public:

   student()

   {

       cout
<<"构造"
<< endl;

   }

   ~student()

   {

       cout
<<"析构"
<< endl;

   }

};

 

classX

{

public:

   void
*p;//存储地址

   charstr[30];

   X(void
*pt) :p(pt)//这时候pt传递进来的是内存地址

   {

   }

};//处理异常

 

boolquit
=false;

 

voidrun()

{

   student
*p =newstudent;

   //delete p;

   //p = nullptr;

 

   //异常检测泄露

   if
(p!=nullptr)

   {

       quit
=true;

       if
(quit ==true)

       {

           throwX(reinterpret_cast<void
*>(p));//抛出异常,调用构造函数

       }

   }

}

 

voidmain()

{

   try

   {

       run();

   }

   catch
(Xe)

   {

       cout
<<"内存异常,内存泄露"
<< e.p;

   }

 

   cin.get();

}

5.异常的虚函数

#include<iostream>

#include<string>

usingnamespacestd;

 

classbox  //正方体

{

public:

   box(intdata)

   {

       cout
<<"开始构造";

       if
(data == 0)

       {

           zeroz1(22);

           z1.seterror(21);

           throwz1;

       }

       elseif
(data > 0 &&data<100)

       {

           throwsmall();

       }

       else if
(data>10000)

       {

           throwbig();

       }

       elseif
(data > 100 &&data
< 10000)

       {

           a
= data;

       }

       else

       {

           throwwrong{};

       }

   }

 

   int gettiji()

   {

       return a*a*a;

   }

 

   classwrong

   {

   public:

       virtualvoidshow()//虚函数

       {

           cout
<<"wrong" <<endl;

       }

   };

   //注意:这里继承了wrong

   classbig
:publicwrong

   {

   public:

       //实现了虚函数

       voidshow()

       {

           cout
<<"big wrong" <<endl;

       }

   };

   //注意:这里继承了wrong

   classsmall
:publicwrong

   {

   public:

       //实现了虚函数

       voidshow()

       {

           cout
<<"small wrong" <<endl;

       }

   };

 

   classzero
:publicsmall //两种错误的处理方式都接受

   {

   public:

       interrorcode;

       zero(inti)
:errorcode(i)

       {

       }

       void seterror(inti)

       {

           errorcode
=i;

       }

   };

private:

   inta;//变长

};

 

voidmain()

{

   try

   {

       boxnewbox(11168);

   }

   catch
(box::zerow)

   {

       if
(w.errorcode
== 22)

       {

           cout
<<"22号错误正方体长度不可以为0";

       }

       else

       {

           cout
<<"非22号错误正方体长度不可以为0";

       }

   }

   //虚函数一个接口处理多个错误

   //引用是指针实现的,用一个父类的引用

   catch
(box::wrong
&wrong1)

   {

       wrong1.show();

   }

 

   cin.get();

}

运行结果:

6.模板类的异常

#include<iostream>

usingnamespacestd;

 

//typename会明确类型

 

//模板的异常,处理通用的数据类型,类中包含一个如果使用

//虚函数,虚函数可以指针,引用来实现

//异常处理机制,一个接口处理通用的异常

 

template<classT>

classArray

{

public:

   classwrong

   {

   public:

       //虚函数

       virtualvoidshow()

       {

           cout
<<" wrong " <<typeid(T).name();

       }

   };

   classbig
:publicwrong

   {

   public:

      intx;

       big(intn)
:x(n){}

       voidshow()

       {

           cout
<<"big wrong"<<x
<<" " <<typeid(T).name();

       }

   };

   classsmall
:publicwrong

   {

   public:

       intx;

       small(intn)
:x(n){}

       voidshow()

       {

           cout
<<"small wrong" <<x
<<" " <<typeid(T).name();;

       }

   };

   Array(intn)

   {

       if
(n > 0 &&n<10)

       {

           throwsmall(n);

       }

       elseif
(n>10000)

       {

           throwbig(n);

       }

       elseif
(n < 0)

       {

           throwwrong();

       }

       else

       {

           p
=newT[n];

           size
= n;

       }

   }

private:

   intsize;

   T
*p;

};

 

voidmain()

{

   try

   {

       Array<double>may(1);

   }

   catch
(Array<double>::wrong
& wrong1)

   {

       wrong1.show();

   }

   cin.get();

}

运行结果:

 

 

时间: 2024-10-16 04:36:41

1.C++异常处理的相关文章

异常处理:android中添加按钮事件,出现NullPointerException

问题描述 异常处理:android中添加按钮事件,出现NullPointerException 解决方案 在maincsactivity的oncreate的72行找,有没有对象为null 解决方案二: 对象为空,要么你的按钮对象还没初始化,要么点击代码里有空对象,你调试一下便知 解决方案三: 空指针异常,没什么难找的,Debug一下即可很快找到: 解决方案四: 空指针异常,按钮对象没有初始化 解决方案五: 可能你声明了一个View,但是你没有findViewById,或者findViewById

异常处理汇总-后端系列

异常处理汇总:http://www.cnblogs.com/dunitian/p/4599258.html SignalR   01.SignalR:"System.Reflection.TargetInvocationException"类型的未经处理的异常在 mscorlib.dll 中发生 http://www.cnblogs.com/dunitian/p/5232229.html 02.SignalR代理对象异常:Uncaught TypeError: Cannot read

一个用于J2EE应用程序的异常处理框架

在大多数Java项目中,大部分代码都是样板代码.异常处理就属于此类代码.即使业务逻辑只有3到4行代码,用于异常处理的代码也要占10到20行.本文将讨论如何让异常处理保持简单和直观,使开发人员可以专心于开发业务逻辑,而不是把时间浪费在编写异常处理的样板代码上.本文还将说明用于在J2EE环境中创建和处理异常的基础知识和指导原则,并提出了一些可以使用异常解决的业务问题.本文将使用Struts框架作为表示实现,但该方法适用于任何表示实现. 使用checked和unchecked异常的场景 您是否曾经想过

PHP错误处理及异常处理笔记

 给新人总结一下PHP的错误处理. PHP提供了错误处理和日志记录的功能. 这些函数允许你定义自己的错误处理规则,以及修改错误记录的方式. 这样,你就可以根据自己的需要,来更改和加强错误输出信息以满足实际需要. 通过日志记录功能,你可以将信息直接发送到其他日志服务器,或者发送到指定的电子邮箱(或者通过邮件网关发送),或者发送到操作系统日志等,从而可以有选择的记录和监视你的应用程序和网站的最重要的部分. 错误报告功能允许你自定义错误反馈的级别和类型,可以是简单的提示信息或者使用自定义的函数进行处理

JAVA【异常二】异常处理机制

Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题: 什么出了错? 在哪出的错? 为什么出错? 在有效使用异常的情况下,异常类型回答了"什么"被抛出,异常堆栈跟踪回答了"在哪"抛出,异常信息回答了"为什么"会抛出.   在Java 应用程序中,异常处理机制为:抛出异常,捕捉异常. 抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运

前端-java web 全局异常处理 如何配置

问题描述 java web 全局异常处理 如何配置 怎样配置java web 前端在访问该项目中根本不存在的方法的时候 跳转异常页面啊? 解决方案 java web异常处理java web 中几种异常处理Java web的几种异常处理 解决方案二: 看你使用什么技术了.要是ssh框架,直接使用struts2或者spring mvc的拦截器就行,如果是servlet,那就自己写一个拦截器. 解决方案三: 前端访问项目中不存在的方法是什么意思? 页面调用脚本方法不存在的时候浏览器是会执行异常的. 解

Spring4.1新特性——异步调度和事件机制的异常处理

Spring 4.1对异步调用提供了AsyncResult及SuccessCallback.FailureCallback.和异常处理的支持:对事件调度也提供了相应的异常处理器.   1.事件调度异常处理器 1.1.定义异常处理器: Java代码   public class MyErrorHandler implements ErrorHandler {       @Override       public void handleError(Throwable throwable) {  

异常处理汇总-服务器系列

异常处理汇总:http://www.cnblogs.com/dunitian/p/4599258.html   公司/本地服务器系列 1.IIS7.5+WebConfig实现页面伪静态和301重定向 http://www.cnblogs.com/dunitian/p/4324341.html 2.服务器环境~某个页面无法访问的处理 http://www.cnblogs.com/dunitian/p/4325027.html 3.win7+IIS7下木有4.0框架问题的解决方案 http://ww

异常处理汇总-数据库系列

异常处理汇总:http://www.cnblogs.com/dunitian/p/4599258.html SQLServer 1.[SQL]关于无法附加文件的错误 http://www.cnblogs.com/dunitian/p/4165249.html 2.在sql server中建存储过程,如果需要参数是一个可变集合怎么处理? http://www.cnblogs.com/dunitian/p/4501268.html 3.关于Sa系列用户不能登录,只能本地windows身份验证的说明

Node.js之异常处理

   记得刚刚开始学Node.js时自己尝试着写了一个简单的http服务器,跟以前接触过的php相比感觉更自由,编起码来也更爽了.但是某天发现稍微一个很小的错误就导致整个http进程挂掉了,顿时有种不靠谱的感觉啊,跟php比起来感觉Node.js容错能力确实弱了很多,起码一个php文件出错也不会导致所有的服务都挂掉.           后来接触到Node.js web开发框架后感觉也不是那么轻易就让整个进程都挂掉的,于是便想研究下Node.js究竟是如何来处理各种异常从而避免整个进程挂掉的.