C异常处理和C++异常处理的对比

每一种编译器实现异常处理的方式会有所不同,但是都是基于Windows的SEH异常处理。这里以MSC编译器为例。

C异常处理#

#include <Windows.h>
int main(int argc, char* argv[])
{
	_try
	{
		_try
		{

		}
		_except(EXCEPTION_EXECUTE_HANDLER)
		{

		}
	}
	_finally
	{

	}
	return 0;
}

MSC编译器会为每一个函数设置一个异常处理回调函数,此函数为_except_handlerX()。对于_except()而言,需要判断其括号中函数的返回值,其返回值一般为EXCEPTION_EXECUTE_HANDLER(可以处理此异常),EXCEPTION_COTINUE_SEARCH(不能处理此异常),EXCEPTION_CONTINUE_EXECUTION(此异常已经被处理)。当返回值为EXCEPTION_EXECUTE_HANDLER时就会执行_except()中的异常处理代码,对于_finally而言其内的代码总是会被执行。需要注意的是这几个返回值与我们在SEH异常处理函数的返回值不是一回事。

C++异常处理#

#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
	try
	{
            throw 1;
	}
	catch(int i)
	{

	}
	return 0;
}

c++异常处理包括三个关键字try:监视异常,throw:抛出异常,catch:捕获异常。而且C++异常处理只能捕获throw产生的异常,因为throw会在内部调用kernel!RaiseException,并使用0xE06D7363"MSC"作为异常代码。C异常处理可以捕获我们所了解的中断异常,除零异常等异常。

C++异常处理也会为函数设置一个异常处理回调函数(代理函数),此函数为_CxxFrameHandlerX()。此函数与C异常处理中的异常回调函数_except_handlerX()作用相似,只不过其涉及到对象所以处理更复杂。

总结#

因为MSC编译器只能为一个函数提供一个异常代理函数(C的_except_handlerX(),C++的_CxxFrameHandlerX()),所以同一个函数中不能同时使用C异常处理和C++异常处理。

posted @   怎么可以吃突突  阅读(439)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
主题色彩