C++异常用try、throw、catch三个关键字处理,基本的思路就是用try来捕捉异常、用throw抛出异常、用catch捕获异常并处理。
基本格式如下:
try {
if (subscript <0 || subscript >9) {
throw subscript;
} else {
cout <<"数组对应的元素:"<< arr[subscript]<<endl;
}
} catch (int) {
cout <<"数组下标越界!\n";
}
try {
if (subscript <0 || subscript >9) {
throw subscript;
} else {
cout <<"数组对应的元素:"<< arr[subscript]<<endl;
}
} catch (int) {
cout <<"数组下标越界!\n";
} catch (char *) {
} catch (...) {
}
void returnElement(int subscript,int arr[]) {
if (subscript <0 || subscript >9) {
throw subscript;
} else {
cout <<"数组对应的元素:"<< arr[subscript]<<endl;
}
}
int main(int argc,constchar * argv[]) {
int subscript;
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
cout <<"请输入下标:";
cin >> subscript;
try {
returnElement(subscript, arr);
} catch (int) {
cout <<"数组下标越界!\n";
}
return0;
}
void returnElement(int subscript,int arr[]) {
if (subscript <0 || subscript >9) {
throw subscript;
} else {
cout <<"数组对应的元素:"<< arr[subscript]<<endl;
}
}
void myAbort() {
cout <<"error!!!\n";
//释放程序中的系统资源
exit(1);
}
int main(int argc,constchar * argv[]) {
int subscript;
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
cout <<"请输入下标:";
cin >> subscript;
try {
set_terminate(myAbort);
returnElement(subscript, arr);
} catch (char) {
cout <<"数组下标越界!\n";
}
return0;
}
当然如果有catch(...),这个就没必要了。
在程序设计中大多数异常的类型都是类,当然catch()语句可以捕获任意类型的异常,为异常定义一个类来描述发生的错误信息当然是很有用的,实现方法只需实现这个类,其余的和catch(基本类型)是一致的。
c++的标准库中抛出的异常称为标准异常,c++的标准库是经过十余年的发展形成的,有兴趣的可以了解。
下面我们来讨论一次Objc的异常处理(虽然很少用到、但作为一种机制、有其存在的理由):
Objc提供了@try、@catch、@throw、@finally来捕捉异常:
@try
{
}
@catch(异常类1 实例)
{
}
@catch(异常类2 实例)
...
@finally
{
}
在执行@try块时若出现异常,系统将生成一个异常对象,并由系统抛出异常;
{
NSException类是所有异常类的父类
}
如果异常对象为@catch()块中异常类或其子类的实例,则由该@catch()块捕获异常;
{
可以有多条@catch()语句,目的是提供更细致的异常信息,但只会执行其中的一条,所以@catch()语句应先处理子类异常,再处理父类异常,
}
@finally负责回收资源,@catch()和@finally()不是必须的,但二者必须有一种,同时出现时,@finally必须位于@catch()之后,,而且总会被执行。
@throw语句是可以单独使用的,当我们自定了一个继承自NSExceotion的类时,我们可以自定义增加一些附加信息,然后直接由@throw抛出。
如同邮电大学的标志(读书顶个球用),这两门语言存在于历史的长河中几十年之久,有着各自的优点与缺点!