1.C++异常处理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了1.C++异常处理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5447字,纯文字阅读大概需要8分钟。
内容图文
1 异常捕获案例 1
#include <iostream>
#include <string>
using namespace std ;
// 标识错误的类型
class wrong {};
int intdiv ( int a , int b )
{
try
{
if ( b == 0)
{
throw 10; // 可以是任何对象 wrong()
}
int c = a / b ;
return c ;
}
catch ( int data )
{
cout << " 除法异常已经处理" ;
return -1;
}
}
int intdivA ( int a , int b )
{
return a / b ;
}
void main ()
{
int x , y ;
cin >> x >> y ;
try
{
if ( y == 0)
{
throw " 被除数为0" ;
}
else if ( x == 0)
{
throw " 除数为0" ;
}
}
// 说明捕获的可以使字符串
catch ( const char * s )
{
if ( strcmp ( s , " 被除数为0" ) == 0)
{
cout << " 被除数为0异常,请重新输入" ;
cin >> x >> y ;
}
else if ( 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>
using namespace std ;
class box // 正方体
{
public :
box ( int data )
{
std :: cout << " 开始构造" << std :: endl ;
if ( data == 0)
{
// 使用zero抛出异常
zero z1 ;
z1 . errorcode = 22;
throw z1 ;
}
else if ( data > 0 && data < 100)
{
// 注意下面是一个(),并非{}
throw small ();
}
else if ( data >=100 && data <=10000)
{
a = data ;
}
else if ( data >10000)
{
// 使用big抛出异常
throw big ();
}
else
{
// 使用wrong抛出异常
throw wrong ();
}
}
// 用于获得体积
int gettiji ()
{
return a * a * a ;
}
class zero {
public :
int errorcode ;
};
class wrong {};
class big {};
class small {};
private :
int a ; // 变长
};
void main ()
{
try
{
//box newbox(0);
//box newbox(99);
//box newbox(100);
//std::cout <<newbox.gettiji() << endl;
box newbox (100000);
}
catch ( box :: zero w )
{
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;
box newbox (100000);
当前运行结果:
3 内存分配异常的处理( std::nothrow )
#include <iostream>
#include <new>
using namespace std ;
struct big
{
double db [200000];
};
// 测试使用异常使得内存异常的时候仍然能够正常使用
void main ()
{
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>
using namespace std ;
class student
{
public :
student ()
{
cout << " 构造" << endl ;
}
~ student ()
{
cout << " 析构" << endl ;
}
};
class X
{
public :
void * p ; // 存储地址
char str [30];
X ( void * pt ) : p ( pt ) // 这时候pt传递进来的是内存地址
{
}
}; // 处理异常
bool quit = false ;
void run ()
{
student * p = new student ;
//delete p;
//p = nullptr;
// 异常检测泄露
if ( p != nullptr )
{
quit = true ;
if ( quit == true )
{
throw X ( reinterpret_cast < void *>( p )); // 抛出异常,调用构造函数
}
}
}
void main ()
{
try
{
run ();
}
catch ( X e )
{
cout << " 内存异常,内存泄露" << e . p ;
}
cin . get ();
}
5. 异常的虚函数
#include <iostream>
#include <string>
using namespace std ;
class box // 正方体
{
public :
box ( int data )
{
cout << " 开始构造" ;
if ( data == 0)
{
zero z1 (22);
z1 . seterror (21);
throw z1 ;
}
else if ( data > 0 && data <100)
{
throw small ();
}
else if ( data >10000)
{
throw big ();
}
else if ( data > 100 && data < 10000)
{
a = data ;
}
else
{
throw wrong {};
}
}
int gettiji ()
{
return a * a * a ;
}
class wrong
{
public :
virtual void show () // 虚函数
{
cout << "wrong" << endl ;
}
};
// 注意:这里继承了wrong
class big : public wrong
{
public :
// 实现了虚函数
void show ()
{
cout << "big wrong" << endl ;
}
};
// 注意:这里继承了wrong
class small : public wrong
{
public :
// 实现了虚函数
void show ()
{
cout << "small wrong" << endl ;
}
};
class zero : public small // 两种错误的处理方式都接受
{
public :
int errorcode ;
zero ( int i ) : errorcode ( i )
{
}
void seterror ( int i )
{
errorcode = i ;
}
};
private :
int a ; // 变长
};
void main ()
{
try
{
box newbox (11168);
}
catch ( box :: zero w )
{
if ( w . errorcode == 22)
{
cout << "22 号错误正方体长度不可以为0" ;
}
else
{
cout << " 非22号错误正方体长度不可以为0" ;
}
}
// 虚函数一个接口处理多个错误
// 引用是指针实现的,用一个父类的引用
catch ( box :: wrong & wrong1 )
{
wrong1 . show ();
}
cin . get ();
}
运行结果:
6. 模板类的异常
#include <iostream>
using namespace std ;
//typename 会明确类型
// 模板的异常,处理通用的数据类型,类中包含一个如果使用
// 虚函数,虚函数可以指针,引用来实现
// 异常处理机制,一个接口处理通用的异常
template < class T >
class Array
{
public :
class wrong
{
public :
// 虚函数
virtual void show ()
{
cout << " wrong " << typeid ( T ). name ();
}
};
class big : public wrong
{
public :
int x ;
big ( int n ) : x ( n ){}
void show ()
{
cout << "big wrong" << x << " " << typeid ( T ). name ();
}
};
class small : public wrong
{
public :
int x ;
small ( int n ) : x ( n ){}
void show ()
{
cout << "small wrong" << x << " " << typeid ( T ). name ();;
}
};
Array ( int n )
{
if ( n > 0 && n <10)
{
throw small ( n );
}
else if ( n >10000)
{
throw big ( n );
}
else if ( n < 0)
{
throw wrong ();
}
else
{
p = new T [ n ];
size = n ;
}
}
private :
int size ;
T * p ;
};
void main ()
{
try
{
Array < double > may (1);
}
catch ( Array < double >:: wrong & wrong1 )
{
wrong1 . show ();
}
cin . get ();
}
运行结果:
原文:http://blog.csdn.net/tototuzuoquan/article/details/39105693
内容总结
以上是互联网集市为您收集整理的1.C++异常处理全部内容,希望文章能够帮你解决1.C++异常处理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。