c异常处理习题答案
B.一个try语句可以有多个catch语句
C.catch(…)语句可以放在catch语句组的中间
D.程序中try语句与catch语句是一个整体,缺一不可
下列程序运行结果为(A)。
#include<iostream>
using namespace std;
class S{
public:
~S( ){cout<<”S”<<”\t”;}
解法一
#include <iostream>
#include <cstring>
using namespace std;
class String{
public:
String(const char*);
String(const String&);
~String();
char operator[](int);
delete[] sPtr;
}
char String::operator[](int subscript){
if(subscript<0 || subscript>strlen(sPtr))
throw(subscript);
return *(sPtr+subscript);
}
int main(){
try{
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);
strcpy(sPtr,s);
}
String::String(const String ©){
sPtr=new char[strlen+1];
if(sPtr==NULL)throw("Copy constructor abnormal");
strcpy(sPtr,;
}
String::~String(){
1.概念填空题
1.1C++程序将可能发生异常的程序块放在try中,紧跟其后可放置若干个对应的catch,在前面所说的块中或块所调用的函数中应该有对应的throw,由它在不正常时抛出异常,如与某一条catch类型相匹配,则执行该语句。该语句执行完之后,如未退出程序,则执行catch后续语句。如没有匹配的语句,则交给C++标准库中的termanite处理。
try
{throw "exception";}
catch( char*)
{cout<<"exception”<<endl;}
throw"exception";
}
~T( ) {cout<<"destructor";}
};
void main()
{cout<<"main function”<< endl;
}
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;
strcpy(sPtr,s);
}
String::String(const String ©){
sPtr=new char[strlen+1];
if(sPtr==NULL)throw("Copy constructor abnormal");
strcpy(sPtr,;
}
String::~String(){
D.throw语句抛出的异常可以不被捕获
关于函数声明float fun(int a,int b)throw,下列叙述正确的是()。
A.表明函数抛出float类型异常
B.表明函数抛出任何类型异常
C.表明函数不抛出任何类型异常
D.表明函数实际抛出的异常
下列叙述错误的是()。
A.catch(…)语句可捕获所有类型的异常
3.选择题
下列关于异常的叙述错误的是(A)。
A.编译错属于异常,可以抛出
B.运行错属于异常
C.硬件故障也可当异常抛出
D.只要是编程者认为是异常的都可当异常抛出
下列叙述错误的是()。
A.throw语句须书写在时语句块中
B.throw语句必须在try语句块中直接运行或通过调用函数运行
C.一个程序中可以有try语句而没有throw语句
}
return 0;
}
解法二
#include <iostream>
#include <cstring>
#include <stdexcept>
using namespace std;
class String{
public:
String(const char*);
String(const String&);
~CException() {}
void Reason() { cout <<"Exception:"<< m_nReason << endl; }
private:
int m_nReason;
};
void fn1(){
throw new CException(EXCEPTION_1);
}
int main(){
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;
try{
fn1();
}Hale Waihona Puke catch(CException* e){
e->Reason();
}
return 0;
}
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");
};
char fun0() {
S s1;
throw(‘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>
throw表达式的行为有些像函数的函数调用,而catch子句则有些像函数的函数定义。函数的调用和异常处理的主要区别在于:建立函数调用所需的信息在编译时已经获得,而异常处理机制要求运行时的支撑。对于函数,编译器知道在哪个调用点上函数被真正调用;而对于异常处理,异常是随机发生的,并沿调用链逆向查找异常处理子句,这与运行时的多态是不一样的。
sPtr=new char[strlen(s)+1];
if(sPtr==NULL)throw("Constructor abnormal");
strcpy(sPtr,s);
}
String::String(const String ©){
sPtr=new char[strlen+1];
if(sPtr==NULL)throw("Copy constructor abnormal");
#include <iostream>
using namespace std;
enum{EXCEPTION_1 = 1, EXCEPTION_2, EXCEPTION_3};
class CException{
public:
CException(int nReason) { m_nReason = nReason; }
2.简答题
2.1C++中的异常处理机制意义,作用是什么?
当在try块中抛出异常后,程序最后是否回到try块中继续执行后面的语句?
什么叫抛出异常?catch可以获取什么异常参数?是根据异常参数的类型还是根据参数的值处理异常?请编写测试程序验证。