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;

}

voidmain()

{

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)

{

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

throwsmall();

}

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

{

a
=data;

}

elseif
(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-08-28 19:57:29

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

Laravel 5.4 中的异常处理器和HTTP异常处理实例教程

错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器中(出于安全考虑),这个时候我们仍然要捕获异常,只不过不是显示到浏览器中,而是记录到日志中,方便日后排查问题. 百牛信息技术bainiu.ltd整理发布于博客园 Laravel当然支持PHP原生的错误和异常处理,但是在此基础上进行了一些封装处理,从而更方便在不同开发环境切换以及对错误和异常的处理.

跟着百度学PHP[11]-PHP当中的异常处理

首先要说一下常见的三种错误: 1.语法错误 2.运行错误 3.逻辑错误 00x1 错误报告及错误级别 PHP的错误分为三个等级 1.注意(notice)   没有变量a 2.警告(warning) 没有给函数传值 3.致命的错误(fatal error) 函数写错 错误的报告级别可以在PHP.ini当中修改.在PHP.ini当中找到错误报告“error_reporting = E_ALL ” 这个的意思是将所有的错误都提示出来.ps:~是除了的意思.&是和的意思.error_reporting

JAVASE02-Unit08: 文本数据IO操作 、 异常处理

Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; /** * java.io.Ob

python3_装饰器_异常处理

装饰器: def auth(func):     def wrapper(name):                     如果函数带参数,要加在这里         user=raw_input("input passwd:").strip()         if user=='test':             print "welcome login"             func(name)              如果函数带参数,要加在这里

动手动脑(异常处理)

1.请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. import javax.swing.*; class AboutException { public static void main(String[] args) { float i=1, j=0, k; k=i/j; System.out.println(k); try { k = i/j;    // Causes division-by-zero exceptio

异常处理

我们在使用Java语言高级API进行程序设计之前,我们还需要理解Java语言中另一个基础特色-----异常处理 异常(Exception)是程序在执行过程中所产生的问题.导致异常产生的原因有很多种: 用户输入了无效的数据.找不到一个需要打开的文件.在通讯过程中网络连接断开或者JVM发生了内存溢出 异常的分类: 检查异常-----是用户错误或不能被程序所遇见的问题 运行时异常-----是一个程序在运行过程可能发生的问题 错误-------实际上,错误根本不是异常,但却是用户或程序所无法控制的问题

Java异常处理

异常的层次结构 所有的异常类都是 java.lang.Exception 类的子类型.异常类都是 Throwable 类的子类.除了异常类 Error 类也是由 Throwable 类产生的的子类1. public String getMessage() 返回关于发生异常的细节信息,这些信息在Throwable的构造函数中被初始化2. public Throwable getCause() 返回发生异常的原因,由 Throwable 对象来表示3. public String toString(

SpringMVC 异常处理

一.异常解析器应该具有的功能: 1.既然使用异常解析器,那么就不必在Controller中对异常进行处理,抛出即可,简化开发,异常统一控制. 2.ajax请求(有@ResponseBody的Controller)发生错误,输出JSON. 3.页面请求(无@ResponseBody的Controller)发生错误,输出错误页面. 4. 它需要与AnnotationMethodHandlerAdapter使用同一个messageConverters 5.异常处理细节可控制. 二.SpringMVC异

16.如何自学Struts2之Struts2异常处理[视频]

16.如何自学Struts2之Struts2异常处理[视频] 之前写了一篇"打算做一个视频教程探讨如何自学计算机相关的技术",优酷上传不了,只好传到百度云上: http://pan.baidu.com/s/1kTDsa95 有问题可以直接回复这篇文章.

详解Linux内核异常处理体系结构

本节内容:Linux内核异常处理的的初始化过程和异常发生时的处理流程. [首先来区分一下两个概念:中断(Interrupt)和异常(Exception).中断属于异常的一种,就拿2440开发板来说,他有60多种中断源,例如来自DMA控制器.UART.IIC和外部中断等.2440有一个专门的中断控制器来处理这些中断,中断控制器在接收到这些中断信号之后就需要ARM920T进入IRQ或FIQ模式进行处理,这两种模式也是中断异常的仅有模式.而异常的概念要广的多,它包括复位.未定义指令.软中断.IRQ等等