练习7.1
请找出以下函数中所有可能发生错误的地方。
int *alloc_and_init(string file_name)
{
ifstream infile(file_name.c_str());
int elem_cnt;
infile >> elem_cnt;
int *pi = allocate_array(elem_cnt);
int elem;
int index = 0;
while (infile >> elem)
pi[index++] == elem;
sort_array(pi, elem_cnt);
register_data(pi);
return pi;
}
练习7.2
下列函数被上题的alloc_and_init()调用,执行失败时会发出异常:
allocate_array() 发出异常noMem
sort_array() 发出异常Int
register_data() 发出异常string
安置一个try块,以及相应的catch子句,将错误打印出来即可。
int *alloc_and_init(string file_name)
{
ifstream infile(file_name.c_str());
if (!infile)return 0; //需考虑文件可能未打开
int elem_cnt;
infile >> elem_cnt;
if (!infile)return 0; //需考虑内容读取失败
try{
int *pi = allocate_array(elem_cnt); //(1)
int elem;
int index = 0;
while (infile >> elem)
pi[index++] == elem;
sort_array(pi, elem_cnt); //(2)
register_data(pi); //(3)
}
catch (const noMem &memFail){ //异常情况1
cerr << "alloc_and_init():allocate_array failure!\n"
<< memFail.what() << endl;
return 0;
}
catch (int &sortFail){ //异常情况2
cerr << "alloc_and_init():sort_array failure!\n"
<< "thrown integer values: " << sortFail << endl;
return 0;
}
catch (string ®isterFail){ //异常情况3
cerr << "alloc_and_init():register_data failure!\n"
<< "thrown integer value: " << registerFail << endl;
return 0;
}
return pi; //没有异常则会执行到此
}