c异常处理习题答案

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
strcpy(sPtr,s);
}
String::String(const String &copy){
sPtr=new char[strlen+1];
if(sPtr==NULL)throw("Copy constructor abnormal");
strcpy(sPtr,;
}
String::~String(){
delete[] sPtr;
}
char String::operator[](int subscript){
if(subscript<0 || subscript>strlen(sPtr))
throw(subscript);
return *(sPtr+subscript);
}
int main(){
try{
~CException() {}
void Reason() { cout <<"Exception:"<< m_nReason << endl; }
private:
int m_nReason;
};
void fn1(){
throw new CException(EXCEPTION_1);
}
int main(){
};
char fun0() {
S s1;
thrቤተ መጻሕፍቲ ባይዱw(‘T’);
return‘0’;
}
void main(){
try{
cout<<fun0()<<”\t”;}
catch(char c){
cout<<c<<”\t”;}
}
A.S TB.O S TC.O TD.T
4.写出程序运行结果
#include <iostream>
5.程序设计题
以String类为例,在String类的构造函数中使用new分配内存。如果操作不成功,则用try语句触发一个char类型异常,用catch语句捕获该异常。同时将异常处理机制与其他处理方式对内存分配失败这一异常进行处理对比,体会异常处理机制的优点。
#include <iostream>
#include <cstring>
}
return *(sPtr+subscript);
}
int main(){
try{
String str1("This is C++");
String str2(str1);
cout<<str1[3]<<endl;
cout<<str2[18]<<endl;
}
catch(char* c){
cout<<c<<endl;
}
catch(out_of_range &excp){
cout<<()<<endl;
return -1;
}
return 0;
}
定义一个异常类Cexception,有成员函数reason(),用来显示异常的类型。定义一个函数fun1()触发异常,在主函数try模块中调用fun1(),在catch模块中捕获异常,观察程序执行流程。
}
return 0;
}
解法二
#include <iostream>
#include <cstring>
#include <stdexcept>
using namespace std;
class String{
public:
String(const char*);
String(const String&);
throw表达式的行为有些像函数的函数调用,而catch子句则有些像函数的函数定义。函数的调用和异常处理的主要区别在于:建立函数调用所需的信息在编译时已经获得,而异常处理机制要求运行时的支撑。对于函数,编译器知道在哪个调用点上函数被真正调用;而对于异常处理,异常是随机发生的,并沿调用链逆向查找异常处理子句,这与运行时的多态是不一样的。
using namespace std;
int a[10]={1,2, 3, 4, 5, 6, 7, 8, 9, 10};
int fun( int i);
void main()
{int i ,s=0;
for( i=0;i<=10;i++)
{try
{ s=s+fun(i);}
catch(int)
{cout<<”数组下标越界!”<<endl;}
1.概念填空题
1.1C++程序将可能发生异常的程序块放在try中,紧跟其后可放置若干个对应的catch,在前面所说的块中或块所调用的函数中应该有对应的throw,由它在不正常时抛出异常,如与某一条catch类型相匹配,则执行该语句。该语句执行完之后,如未退出程序,则执行catch后续语句。如没有匹配的语句,则交给C++标准库中的termanite处理。
strcpy(sPtr,;
}
String::~String(){
delete[] sPtr;
}
int main(){
try{
String str1("This is C++");
String str2(str1);
}
catch(char* c){
cout<<c<<endl;
}
return 0;
}
在的基础上,重载数组下标操作符[],使之具有判断与处理下标越界功能。
delete[] sPtr;
}
char String::operator[](int subscript){
if(subscript<0 || subscript>strlen(sPtr)){
char* out_of_index="Out of range in index of array";
throw(out_of_index);
2.简答题
2.1C++中的异常处理机制意义,作用是什么?
当在try块中抛出异常后,程序最后是否回到try块中继续执行后面的语句?
什么叫抛出异常?catch可以获取什么异常参数?是根据异常参数的类型还是根据参数的值处理异常?请编写测试程序验证。
为什么C++要求资源的取得放在构造函数中,而资源的释放在析构函数中?
try{
fn1();
}
catch(CException* e){
e->Reason();
}
return 0;
}
D.throw语句抛出的异常可以不被捕获
关于函数声明float fun(int a,int b)throw,下列叙述正确的是()。
A.表明函数抛出float类型异常
B.表明函数抛出任何类型异常
C.表明函数不抛出任何类型异常
D.表明函数实际抛出的异常
下列叙述错误的是()。
A.catch(…)语句可捕获所有类型的异常
#include <iostream>
using namespace std;
enum{EXCEPTION_1 = 1, EXCEPTION_2, EXCEPTION_3};
class CException{
public:
CException(int nReason) { m_nReason = nReason; }
}
cout<<"s=”<<s<<endl;
}
int fun( int i)
{if(i>=10)
throw i;
return a[i];
}
数组下标越界!
S=55
#include <iostream>
using namespace std;
void f();
class T
{public:
T( )
{cout<<"constructor"<<endl;
B.一个try语句可以有多个catch语句
C.catch(…)语句可以放在catch语句组的中间
D.程序中try语句与catch语句是一个整体,缺一不可
下列程序运行结果为(A)。
#include<iostream>
using namespace std;
class S{
public:
~S( ){cout<<”S”<<”\t”;}
try{ f( ); }
catch( char *)
{ cout<<"exception2"<<endl;}
cout<<"main function”<<endl;
}
void f( )
{T t;}
main function
constructor
exception
exception2
main function
using namespace std;
class String{
public:
String(const char*);
String(const String&);
~String();
void ShowStr(){cout<<sPtr<<endl;}
private:
char *sPtr;
};
String::String(const char *s){
String str1("This is C++");
String str2(str1);
cout<<str1[3]<<endl;
cout<<str2[18]<<endl;
}
catch(char* c){
cout<<c<<endl;
}
catch(int i){
cout<<i<<"下标越界"<<endl;
void ShowStr(){cout<<sPtr<<endl;}
private:
char *sPtr;
};
String::String(const char *s){
sPtr=new char[strlen(s)+1];
if(sPtr==NULL)throw("Constructor abnormal");
3.选择题
下列关于异常的叙述错误的是(A)。
A.编译错属于异常,可以抛出
B.运行错属于异常
C.硬件故障也可当异常抛出
D.只要是编程者认为是异常的都可当异常抛出
下列叙述错误的是()。
A.throw语句须书写在时语句块中
B.throw语句必须在try语句块中直接运行或通过调用函数运行
C.一个程序中可以有try语句而没有throw语句
sPtr=new char[strlen(s)+1];
if(sPtr==NULL)throw("Constructor abnormal");
strcpy(sPtr,s);
}
String::String(const String &copy){
sPtr=new char[strlen+1];
if(sPtr==NULL)throw("Copy constructor abnormal");
~String();
char operator[](int);
void ShowStr(){cout<<sPtr<<endl;}
private:
char *sPtr;
};
String::String(const char *s){
sPtr=new char[strlen(s)+1];
if(sPtr==NULL)throw("Constructor abnormal");
try
{throw "exception";}
catch( char*)
{cout<<"exception”<<endl;}
throw"exception";
}
~T( ) {cout<<"destructor";}
};
void main()
{cout<<"main function”<< endl;
解法一
#include <iostream>
#include <cstring>
using namespace std;
class String{
public:
String(const char*);
String(const String&);
~String();
char operator[](int);
strcpy(sPtr,s);
}
String::String(const String &copy){
sPtr=new char[strlen+1];
if(sPtr==NULL)throw("Copy constructor abnormal");
strcpy(sPtr,;
}
String::~String(){
相关文档
最新文档