C++ 異常捕獲 try 和 __try的區別筆記

最近碰到了try 和 __try的區別的問題,經過實測與驗證,發現在vs2019下,確實存在try無法捕獲特定異常的問題,比如下面的代碼:

//以空格作為分割符的符號個數
//內存復制功能
// test1.cpp : 定義控制臺應用程序的入口點。
//
#include <Windows.h>
#include <tchar.h>
#include <winternl.h>
#include <Shlwapi.h>
#include <iostream>int Sub1(const char* v1);
CHAR* Sub2(const CHAR* Source, size_t size);const char* x = "11 11 1 ssssssssssss";int MemStandardTry()
{//仍然使用C++標準的try{}catch(…){}, 但在編譯命令行中加入 /EHa 的參數。這樣VC編譯器不會把try catch模塊給優化掉了。//注意 / EHa的大小寫try{BYTE* pch;pch = (BYTE*)00001234;   //給予一個非法地址 *pch = 6; //對非法地址賦值,會造成Access Violation 異常 }catch (...){std::cout << "catched MemStandardTry" << std::endl;}return 0;
}int MemWinTry()
{__try{BYTE* pch;pch = (BYTE*)00001234;   //給予一個非法地址 *pch = 6; //對非法地址賦值,會造成Access Violation 異常 }__except (EXCEPTION_EXECUTE_HANDLER){std::cout << "catched" << std::endl;}return 0;
}int main()
{MemStandardTry();MemWinTry();
// 	printf("%d\r\n", Sub1(x));
// 	printf("%d\r\n", Sub1(NULL));
// 	char* szChar = (char*)"11 11 1 ssssssssssss";
// 	printf("%s\r\n", Sub2(szChar, 50));return 0;}int Sub1(const char* v1)
{int length = -1;char* Buffer = NULL;__try{Buffer = (char*)malloc(strlen(v1) + 1);strcpy(Buffer, v1);char* pszToken = strtok(Buffer, "s");//在第一次調用 strtok 時,函數跳過前導分隔符(連在一起算一個)并返回指向在 strToken的第一個標記的指針,以空字符終止標記。//通過一系列 strtok 的調用,多個標記將被從 strToken 的其余部分拆開。 每個 strtok調用通過插入 null 字符在該調用返回 token 之后修改strToken。for (; pszToken != NULL; pszToken = strtok(NULL, "s"))length++;length++;}__except (EXCEPTION_EXECUTE_HANDLER){}free(Buffer);return(length);
}CHAR* Sub2(const CHAR* Source, size_t size)
{CHAR* v1 = NULL;__try{v1 = (CHAR*)malloc(size);memcpy(v1, Source, size);}__except (EXCEPTION_EXECUTE_HANDLER){free(v1);v1 = NULL;}return(v1);
}

在不做任何設置的情況下 MemStandardTry()在debug模式下可以捕獲異常 但是release無法捕獲,而MemWinTry()可以正常捕獲異常。

但是實際情況是,當我們按照注釋,設置 ,則發現try也可以在release模式下捕獲該異常。

//仍然使用C++標準的try{}catch(…){}, 但在編譯命令行中加入 /EHa 的參數。這樣VC編譯器不會把try catch模塊給優化掉了。
//注意 / EHa的大小寫

具體設置位置如下:

經過設置后,可以測試正確捕獲異常。

進一步的內容,可以參考C++ 異常捕獲 try 和 __try的區別_異常捕獲的方法與其區別-CSDN博客,謹此紀念。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79759.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark基礎介紹

1. Spark 核心概念 1.1 RDD&#xff08;彈性分布式數據集&#xff09; 定義&#xff1a;RDD&#xff08;Resilient Distributed Dataset&#xff09;是 Spark 的核心抽象&#xff0c;是不可變、可分區、容錯的分布式數據集合。特性&#xff1a; 彈性&#xff1a;自動進行內存…

采用SqlSugarClient創建數據庫實例引發的異步調用問題

基于SqlSugar編寫的多個WebApi接口&#xff0c;項目初始化時采用單例模式注冊SqlSugarClient實例對象&#xff0c;前端頁面采用layui布局&#xff0c;并在一個按鈕事件中通過Ajax連續調用多個WebApi接口獲取數據。實際運行時點擊按鈕會隨機報下面幾種錯誤&#xff1a; Execute…

[原創](現代Delphi 12指南):[macOS 64bit App開發]: 如何獲取當前用戶主目錄(即:~波浪符號目錄)?

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、…

pdf url 轉 圖片

背景&#xff1a;vue2.0需要把pdf轉成圖片&#xff0c;顯示在url里面&#xff0c;使用pdfjs-dist來解決 步驟&#xff1a; 1、安裝依賴包(我的項目是node12&#xff0c;安裝太高版本會報錯) npm i pdfjs-dist2.16.105 2、vue代碼 <template><div class"main…

理解 Open vSwitch (OVS)

Open vSwitch&#xff08;簡稱 OVS&#xff09;是一個開源的 虛擬交換機&#xff0c;主要用于 虛擬化環境&#xff08;如 KVM、Xen、Docker&#xff09;和 軟件定義網絡&#xff08;SDN&#xff09;。它類似于物理交換機&#xff0c;但在軟件層面實現&#xff0c;可以靈活地管理…

S7-1500——零基礎入門1、工業編程基本概念

工業編程基本概念 一,數制與基本數據類型二,數字量信號三,模擬量信號一,數制與基本數據類型 本節主要內容 類別內容主題數制與基本數據類型數制講解十進制、十六進制、二進制及其進位規則;基數、位權概念數據類型介紹PLC 使用的數據類型:未序列數據類型(bit、byte、wor…

kotlin-協程(什么是一個協程)

1.什么指一個協程對于線程來說一個thread就是就是指一個線程&#xff0c;thread為什么成為線程呢&#xff1f;因為他實現了對線程的一個抽象管理&#xff0c;可以管理這個線程&#xff0c;啟動&#xff0c;可以查看各種信息 那么協程呢&#xff1f; public fun CoroutineScop…

七、深入 Hive DDL:管理表、分區與洞察元數據

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月13日 專欄&#xff1a;Hive教程 內容導航 一、表的 DDL 操作 (非創建)二、分區的 DDL 操作三、洞察元數據&#xff1a;SHOW 命令的威力結語&#xff1a;DDL 與 SHOW&#xff0c;Hive 管理的雙翼練習題一、選擇題二、代碼題…

【 Redis | 實戰篇 短信登錄 】

前言&#xff1a; 主要完成了基于Session實現登錄&#xff0c;解決集群的Session共享問題&#xff0c;從而實現了基于Redis來實現共享Session登錄 1.基于Session實現登錄 1.1.發送短信驗證碼 步驟&#xff1a; 前端提交手機號 》校驗手機號 》不符合返回錯誤信息&#xff0…

藍橋杯14屆國賽 合并數列

問題描述 小明發現有很多方案可以把一個很大的正整數拆成若干正整數的和。他采取了其中兩種方案&#xff0c;分別將他們列為兩個數組 {a1,a2,...,an} 和 {b1,b2,...,bm}。兩個數組的和相同。 定義一次合并操作可以將某數組內相鄰的兩個數合并為一個新數&#xff0c;新數的值是…

Doris和Clickhouse對比

目錄 一、Doris和Clickhouse對比1. 底層架構**DorisClickHouse** 2. 運行原理DorisClickHouse 3. 使用場景DorisClickHouse 4. 優缺點對比總結 二、MPP架構和Shared-Nothing 架構對比1. 什么是 MPP 架構&#xff1f;定義特點典型代表 2. 什么是 Shared-Nothing 架構&#xff1f…

niushop單商戶V5多門店版V5.5.0全插件+商品稱重、商家手機端+搭建環境教程

一.系統介紹 【全開源】niushop單商戶V5多門店版V5.5.0版本&#xff0c;我看很多人都想要 商品稱重、商家手機端等插件這套是全插件版本&#xff0c;整合起來本博主也花了不少啦~ Niushop系統是應用thinkphp6開發的完善的電商系統&#xff0c;擁有完善的商品機制&#xff0c;…

內存、磁盤、CPU區別,Hadoop/Spark與哪個聯系密切

1. 內存、磁盤、CPU的區別和作用 1.1 內存&#xff08;Memory&#xff09; 作用&#xff1a; 內存是計算機的短期存儲器&#xff0c;用于存儲正在運行的程序和數據。它的訪問速度非常快&#xff0c;比磁盤快幾個數量級。在分布式計算中&#xff0c;內存用于緩存中間結果、存儲…

Jenkins linux安裝

jenkins啟動 service jenkins start 重啟 service jenkins restart 停止 service jenkins stop jenkins安裝 命令切換到自己的下載目錄 直接用命令下載 wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.190.3-1.1.noarch.rpm 下載直接安裝 rpm -ivh jenkins-2.190.3-…

RabbitMQ ②-工作模式

RabbitMQ 工作模式 官方提供了七種工作模式 Simple&#xff08;簡單模式&#xff09; P&#xff1a;生產者&#xff0c;發布消息到隊列C&#xff1a;消費者&#xff0c;從隊列中獲取消息并消費Queue&#xff1a;消息隊列&#xff0c;存儲消息。 一個生產者&#xff0c;一個…

(2)python開發經驗

文章目錄 1 pyside6加載ui文件2 使用pyinstaller打包 更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;Qt開發 &#x1f448;&#x1f449;python開發 &#x1f448; 1 pyside6加載ui文件 方法1&#xff1a; 直接加載ui文件 from PySide6.QtWidgets import QAp…

【C++】互斥鎖(Mutex)

在C中&#xff0c;互斥鎖&#xff08;Mutex&#xff09;是用于線程同步的重要工具&#xff0c;用于保護共享資源&#xff0c;防止多線程同時訪問導致的數據競爭&#xff08;Data Race&#xff09;問題。 以下是C中互斥鎖的核心用法和示例&#xff1a; 一、基本互斥鎖 std::mut…

Jsoup與HtmlUnit:兩大Java爬蟲工具對比解析

Jsoup&#xff1a;HTML解析利器 定位&#xff1a;專注HTML解析的輕量級庫&#xff08;也就是快&#xff0c;但動態頁面無法抓取&#xff09; 核心能力&#xff1a; DOM樹解析與CSS選擇器查詢 HTML凈化與格式化 支持元素遍歷與屬性提取 應用場景&#xff1a;靜態頁面數據抽…

小白成長之路-vim編輯

文章目錄 Vim一、命令模式二、插入模式3.a:進入插入模式&#xff0c;在當前光標的后一個字符插入![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/fd293c3832ed49e2974abfbb63eeb5bb.png)4.o: 在當前光標的下一行插入5.i:在當前光標所在字符插入&#xff0c;返回命令模…

[redis進階六]詳解redis作為緩存分布式鎖

目錄 一 什么是緩存 緩存總結板書: 二 使?Redis作為緩存 三 緩存的更新策略 1) 定期?成 2) 實時?成 四 面試重點:緩存預熱,緩存穿透,緩存雪崩 和緩存擊穿 1)緩存預熱 2)緩存穿透 3)緩存雪崩 4)緩存擊穿 五 分布式鎖 板書: 1)什么是分布式鎖 2)分布式鎖的基…