0

0

C++怎么处理除零异常_C++运行时错误教程【防护】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-26 16:08:02

|

549人浏览过

|

来源于php中文网

原创

c++整数除零是未定义行为,直接触发sigfpe等信号而非异常,无法用try/catch捕获;安全做法是除前检查y==0及int_min/-1溢出;浮点除零默认生成inf/nan,需手动启用浮点异常或显式校验。

c++怎么处理除零异常_c++运行时错误教程【防护】

除零在C++里根本不会抛出异常

标准C++运行时对整数除零不定义行为,std::div/% 这些操作遇到除数为0时,程序直接崩溃(Linux/macOS 是 SIGFPE,Windows 是 EXCEPTION_INT_DIVIDE_BY_ZERO),不是std::exception子类,try/catch(...) 捕不到。

浮点数除零倒是有定义:按IEEE 754,1.0 / 0.0inf0.0 / 0.0nan,但默认不触发异常——除非你手动开启浮点异常(如用 feenableexcept(FE_DIVBYZERO))。

  • 别写 try { x / y; } catch(...) { ... } 期待捕获整数除零——它永远进不去 catch
  • 调试时看到 Signal: SIGFPE (Arithmetic exception) 就是这里崩了
  • 编译器(如GCC/Clang)加 -fsanitize=undefined 可在运行时报出 division by zero 并附调用栈,比静默崩溃友好得多

怎么安全地检查除零(整数场景)

最可靠的方式永远是「除前判断」,而不是依赖事后捕获。尤其在嵌入式、高频计算或系统级代码中,信号处理开销大、不可控,且跨平台行为不一致。

常见错误是只判 y == 0,但漏掉有符号整数的边界情况:INT_MIN / -1 在补码下会溢出(仍是未定义行为),虽不是除零,但同样崩溃。

立即学习C++免费学习笔记(深入)”;

Runway
Runway

Runway是一个AI创意工具平台,它提供了一系列强大的功能,旨在帮助用户在视觉内容创作、设计和开发过程中提高效率和创新能力。

下载
  • int 类型,检查条件应为:if (y == 0 || (y == -1 && x == INT_MIN))
  • std::div 前也得自己检查除数,它不校验
  • 若逻辑上除数本不该为零(如配置项、用户输入),建议用 assert(y != 0) + 单元测试覆盖该分支,比运行时兜底更早暴露问题

想用信号处理兜底?小心跨平台和线程

Linux用 signal(SIGFPE, handler)sigaction 可捕获除零信号,但Windows要用 SetUnhandledExceptionFilter 或结构化异常(SEH),两者API、语义、线程安全性完全不同。

更大的问题是:信号处理函数内能做的事极少(异步信号安全函数列表极短),不能调用 std::coutmallocprintf,甚至不能安全地 longjmp 回原上下文——多数时候只能记录日志后 _exit

  • 多线程下,signal() 行为未定义;必须用 pthread_sigmask + sigwait 配合 sigaction 才可控
  • 即使捕获成功,程序状态已损坏(寄存器/栈可能不一致),继续执行风险极高
  • 仅建议用于顶层错误上报(如写 crash dump),绝不用于“恢复运算”

浮点除零要不要管?看场景

默认情况下,float/double 除零生成 infnan,不中断执行。这在科学计算、图形渲染中常是合理行为(比如归一化向量时长度为0 → 结果全nan,后续用 isnan() 过滤即可)。

但金融、控制逻辑等要求强确定性的场景,必须提前拦截。此时不应依赖信号,而应开启浮点异常并用 feholdexcept/feraiseexcept 精确控制。

  • 启用除零异常:feenableexcept(FE_DIVBYZERO)(需 <cfenv></cfenv>
  • 之后 1.0f / 0.0f 会触发 SIGFPE,同整数——仍不能用 try/catch 捕获
  • 更稳妥的做法是:用 std::isfinite(x) && std::isfinite(y) && y != 0.0 显式过滤,兼容性最好

真正难的不是“怎么拦”,而是想清楚:这个除零是逻辑缺陷(该提前校验),还是数据自然边界(该接受 inf 并下游处理)。后者往往被忽略,结果 nan 一路传染到最终结果才暴露。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

592

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

831

2023.08.22

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

831

2023.08.22

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

76

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

300

2023.11.28

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

586

2024.08.29

Golang 实际项目案例:从需求到上线
Golang 实际项目案例:从需求到上线

《Golang 实际项目案例:从需求到上线》以真实业务场景为主线,完整覆盖需求分析、架构设计、模块拆分、编码实现、性能优化与部署上线全过程,强调工程规范与实践决策,帮助开发者打通从技术实现到系统交付的关键路径,提升独立完成 Go 项目的综合能力。

1

2026.02.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.3万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号