throw关键字用来抛出一个异常,这个异常会被 try 检测到,进而被 catch 捕获。

异常既然是一份数据,那么就应该有数据类型。C++ 规定,异常类型可以是 int、char、float、bool 等基本类型,也可以是指针、数组、字符串、结构体、类等聚合类型。C++ 语言本身以及标准库中的函数抛出的异常,都是 exception 类或其子类的异常。也就是说,抛出异常时,会创建一个 exception 类或其子类的对象。

可以将 catch 看做一个没有返回值的函数,当异常发生后 catch 会被调用,并且会接收实参(异常数据)。

但是 catch 和真正的函数调用又有区别:
真正的函数调用,形参和实参的类型必须要匹配,或者可以自动转换,否则在编译阶段就报错了。
而对于 catch,异常是在运行阶段产生的,它可以是任何类型,没法提前预测,所以不能在编译阶段判断类型是否正确,只能等到程序运行后,真的抛出异常了,再将异常类型和 catch 能处理的类型进行匹配,匹配成功的话就“调用”当前的 catch,否则就忽略当前的 catch。

#include <windows.h>
#include "resource.h"LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst;
TCHAR szClassName[] = TEXT("expDemo");class Base{ };
class Derived: public Base{ };int WINAPI
WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
{HWND hwnd;MSG messages;WNDCLASSEX wincl;hInst = hThisInstance;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = MAKEINTRESOURCE (IDC_EXPDEMO);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("C++异常处理Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,300,HWND_DESKTOP,NULL,hThisInstance,NULL);ShowWindow (hwnd, nFunsterStil);while (GetMessage (&messages, NULL, 0, 0)){TranslateMessage(&messages);DispatchMessage(&messages);}return messages.wParam;
}LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc;RECT rt;    char szBuffer[100]; switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_exp:      hdc=GetDC(hwnd);try{throw Derived();wsprintf(szBuffer, "%s","This statement will not be executed.");TextOut(hdc,100,10,szBuffer,lstrlen(szBuffer));}catch(int){wsprintf(szBuffer, "%s","Exception type: int");TextOut(hdc,100,40,szBuffer,lstrlen(szBuffer));}catch(char *){wsprintf(szBuffer, "%s","Exception type: cahr *");TextOut(hdc,100,70,szBuffer,lstrlen(szBuffer));}catch(Base){wsprintf(szBuffer, "%s","Exception type: Base");TextOut(hdc,100,100,szBuffer,lstrlen(szBuffer));}catch(Derived){wsprintf(szBuffer, "%s","Exception type: Derived");TextOut(hdc,100,130,szBuffer,lstrlen(szBuffer));}break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("expDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("expDemo"), MB_OK | MB_ICONINFORMATION);break;case IDM_EXIT:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, message, wParam, lParam);                }break;case WM_CREATE:break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);                 GetClientRect(hwnd, &rt);               EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0;
}

运行;

定义了一个基类 Base,又从 Base 派生类出了 Derived。抛出异常时,创建了一个 Derived 类的匿名对象,也就是说,异常的类型是 Derived。
期望的是,异常被catch(Derived)捕获,从输出结果可以看出,异常提前被catch(Base)捕获了,这说明 catch 在匹配异常类型时发生了向上转型(Upcasting)。

参阅:

http://c.biancheng.net/view/2330.html
工程;

资源文件,头文件;

#include "resource.h"
#include <windows.h>/
//
// Menu
//IDC_EXPDEMO MENU
BEGINPOPUP "&File"BEGINMENUITEM "C++异常处理Demo",                    IDM_expMENUITEM "E&xit",                  IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...",             IDM_ABOUTEND
END
#define  IDM_EXIT        10001
#define     IDM_ABOUT       10002#define    IDC_EXPDEMO     10101
#define     IDD_ABOUTBOX    10102
#define     IDM_exp         40001

C++ 异常处理Demo - win32 版相关推荐

  1. C++函数模板Demo - win32 版

    C++ 模板 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个 ...

  2. C语言回调函数Demo - Win32版

    回调函数:通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件 ...

  3. C++ 引用 Demo - Win32 版

    一 引用 C/C++ 禁止在函数调用时直接传递数组的内容,而是强制传递数组指针. 对于结构体和对象没有这种限制,调用函数时既可以传递指针,也可以直接传递内容. 在 C++ 中,有一种比指针更加便捷的传 ...

  4. win32 临界区和简单实例Demo(win32版)

    一 win32 临界区 临界区是一种防止多个线程同时执行一个特定代码段的机制.如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他的所有试图访问此临界区的线程将被挂起,并且一直持续到进入临界区 ...

  5. 告别最好用的微软UWP应用OneNote 微软已经开始将其替换为Win32版

    关注 OneNote 的用户应该都知道微软正在整合 OneNote,也就是 UWP 版的 OneNote 和 Win32 版的 OneNote,这并意味着微软要重新开发一个新的 OneNote,而是 ...

  6. win32版QQ隐藏功能,气泡消息显示详细时间

    偶然发现win32版QQ的一个隐藏功能,QQ在电脑上的消息可以显示为气泡模式和经典模式,气泡模式通常情况下不会显示详细的时间信息,QQ有一个隐藏功能,按鼠标中键可以显示一会详细时间,效果如图 正常是这 ...

  7. C++类的基本概念演示Win32版

    演示C++基本的类的概念,使用Win32:做一个简单的类: #include <windows.h> #include "resource.h"LRESULT CALL ...

  8. LVGL-v8.1 demo win32 VS2017工程

    官方是有 win32 port 项目的,但是说实话,那个工程,配置的乱七八糟的.我这vs2017折腾半天编译不了 还是自己重建一个工程吧 源文件下载 LVGL-v8.1demowin32VS2017工 ...

  9. php银联支付接口 demo,php版银联支付接口开发简单实例详解

    这篇文章主要介绍了php版银联支付接口开发的方法,结合实例形式分析了php银联支付接口开发的具体流程与相关操作技巧,需要的朋友可以参考下 支付接口现在有第三方的支付接口也有银行的支付接口.这里就来介绍 ...

最新文章

  1. 一分钟详解鱼眼镜头标定基本原理及实现
  2. 无法在WEB服务器上启动调试,Web 服务器配置不正确
  3. spring context 例子
  4. webstorm怎么跑项目_怎么跑Mint-UI的实例,你知道吗?
  5. 节能原理 复习(能量平衡+热电联产+联合循环)
  6. mysql 创建用户权限_10.创建 MySQL 用户及赋予用户权限
  7. Angular路由里的canActivate用法
  8. 机动车驾驶人科目三考试项目及合格标准
  9. 《软件需求分析(第二版)》第 2 章——客户眼中的需求 重点部分总结
  10. Defense hash algorithm collision 防御hash算法冲突导致拒绝服务器
  11. (Trie树)leetcode208: Implement Trie,79:Word Search,DFS与BFS(python实现),212:Word Search2...
  12. 【转】JSch - Java实现的SFTP(文件下载详解篇)
  13. linux下MySQL密码修改过程记录
  14. 性能测试工具iPerf和Netperf使用介绍
  15. 支付宝芝麻信用分申请
  16. 如果物联网平台一直不盈利,行业集体该怎么活?
  17. Justinmind恢复30天试用 For Mac
  18. c语言转义字符c,C语言转义字符
  19. Mac电脑使用:Mac电脑一键智能清理神器CleanMyMac X,Android开发者
  20. NC65发布webservice接口开发环境启动服务找不到接口

热门文章

  1. matlab画微分方程的矢量场图_MATLAB偏微分方程
  2. 用JAVASCRIPT实现静态对象、静态方法和静态属性
  3. java中两个整形相除,向上取整
  4. CTFshow 信息收集 web5
  5. blkdiag--生成以输入元素为对角线元素的矩阵
  6. Python进阶05 循环设计
  7. vue页面翻页勾选的记忆功能
  8. 【复习】---【noip2009 普及】细胞问题 (1)
  9. 数据结构——第一章线性表:01线性表的逻辑结构
  10. Kafka+SparkStreaming+Zookeeper(ZK存储Offset,解决checkpoint问题)