C 的异常rethrow
C 的异常rethrow
2006-05-09 | 责任编辑:Michael
语法
很简单,有两种用法,如下:
1、 throw ;
2、 throw exception_obj ;
第一种表示原来的异常对象再次被重新抛出;第二中呢,则表示原来的异常已处理或正在处理中,但此时又引发了另一个异常。示例如下:
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 第一种用法,原来的异常被再次抛出
// 注意它不需要带参数。
throw;
}
try
{
throw 0.5;
}
catch(double value)
{
// 第二种用法,再次抛出另外的一个异常
// 它的语法和其它正常抛出异常的语法一样。
throw “another exception”;
}
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}
在什么地方异常可以rethrow?
当然,异常的rethrow只能在catch block中,或者说在catch block中抛出的异常才是异常的rethrow,因此注意下面的示例程序中存在语法错误,如下:
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 这里的语法是对的。
throw;
}
// 但这里的语法却是不对的。
// 不能在这里进行异常的rethrow
throw;
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}
异常rethrow需要注意的问题!
异常rethrow需要注意什么问题呢?看例子先!
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 异常的rethrow
throw;
}
catch(...)
{
cout << “能打印我这条消息吗?”<< endl;
}
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}
上面的程序运行结果是:“unknow exception”
由此我们可以得出结论,异常的rethrow后,它会在它上一层的trycatch块开始查找匹配的catch block异常处理块,而在同一层中,如果当前的catch block后面还有其它的catch block,它是不会去匹配的。所以程序中一般层次模型的trycatch要比线性结构的trycatch要好一些,如下(示例2要比示例1好):
// 示例1
void main()
{
try
{
}
catch(DataType1&)
{
}
catch(DataType2&)
{
}
catch(DataType3&)
{
}
catch(...)
{
}
}
// 示例2
void main()
{
try
{
try
{
try
{
try
{
}
catch(DataType1&)
{
}
}
catch(DataType2&)
{
}
}
catch(DataType3&)
{
}
}
catch(...)
{
}
}
总结
相遇篇的文章到此结束。通过这几篇文章的介绍,目前已经对异常处理编程的思想,C 异常处理模型、语法,以及C 异常处理与面向对象的关系等等,都有了一个大概性的了解。主人公阿愚根据自己的理解和经验,现在对相遇篇中的知识再做出如下一些总结:
(1) 异常处理编程和面向对象,是现在程序设计和编程中最不可缺少的两个好东东;
(2) C 异常处理模型是层次型的,能很好地支持嵌套;
(3) C 异常处理编程提供try、catch和throw三个关键字。其中try定义受监控的程序块;catch定义异常处理模块;throw让程序员可以在程序执行出错的地方抛出异常;
(4) C 异常处理模型的实现充分使用到了面向对象的思想和方法;
(5) C 异常处理模型中,异常是可以rethrow的。
很简单,有两种用法,如下:
1、 throw ;
2、 throw exception_obj ;
第一种表示原来的异常对象再次被重新抛出;第二中呢,则表示原来的异常已处理或正在处理中,但此时又引发了另一个异常。示例如下:
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 第一种用法,原来的异常被再次抛出
// 注意它不需要带参数。
throw;
}
try
{
throw 0.5;
}
catch(double value)
{
// 第二种用法,再次抛出另外的一个异常
// 它的语法和其它正常抛出异常的语法一样。
throw “another exception”;
}
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}
在什么地方异常可以rethrow?
当然,异常的rethrow只能在catch block中,或者说在catch block中抛出的异常才是异常的rethrow,因此注意下面的示例程序中存在语法错误,如下:
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 这里的语法是对的。
throw;
}
// 但这里的语法却是不对的。
// 不能在这里进行异常的rethrow
throw;
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}
异常rethrow需要注意的问题!
异常rethrow需要注意什么问题呢?看例子先!
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 异常的rethrow
throw;
}
catch(...)
{
cout << “能打印我这条消息吗?”<< endl;
}
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}
上面的程序运行结果是:“unknow exception”
由此我们可以得出结论,异常的rethrow后,它会在它上一层的trycatch块开始查找匹配的catch block异常处理块,而在同一层中,如果当前的catch block后面还有其它的catch block,它是不会去匹配的。所以程序中一般层次模型的trycatch要比线性结构的trycatch要好一些,如下(示例2要比示例1好):
// 示例1
void main()
{
try
{
}
catch(DataType1&)
{
}
catch(DataType2&)
{
}
catch(DataType3&)
{
}
catch(...)
{
}
}
// 示例2
void main()
{
try
{
try
{
try
{
try
{
}
catch(DataType1&)
{
}
}
catch(DataType2&)
{
}
}
catch(DataType3&)
{
}
}
catch(...)
{
}
}
总结
相遇篇的文章到此结束。通过这几篇文章的介绍,目前已经对异常处理编程的思想,C 异常处理模型、语法,以及C 异常处理与面向对象的关系等等,都有了一个大概性的了解。主人公阿愚根据自己的理解和经验,现在对相遇篇中的知识再做出如下一些总结:
(1) 异常处理编程和面向对象,是现在程序设计和编程中最不可缺少的两个好东东;
(2) C 异常处理模型是层次型的,能很好地支持嵌套;
(3) C 异常处理编程提供try、catch和throw三个关键字。其中try定义受监控的程序块;catch定义异常处理模块;throw让程序员可以在程序执行出错的地方抛出异常;
(4) C 异常处理模型的实现充分使用到了面向对象的思想和方法;
(5) C 异常处理模型中,异常是可以rethrow的。
上一篇:C 中catch(…)如何使用
本 文:C 的异常rethrow
下一篇:对象的成员函数中抛出的异常
编辑推荐文章
一周阅读排行