pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

C++:捕捉除以零錯誤

C++ : Catch a divide by zero error(C++:捕捉除以零錯誤)
本文介紹了C++:捕捉除以零錯誤的處理方法,對大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

這是一段簡單的代碼,其中發(fā)生了被零除.我正試圖抓住它:

Here is a simple piece of code where a division by zero occurs. I'm trying to catch it :

#include <iostream>

int main(int argc, char *argv[]) {
    int Dividend = 10;
    int Divisor = 0;

    try {
        std::cout << Dividend / Divisor;
    } catch(...) {
        std::cout << "Error.";
    }
    return 0;
}

但是應(yīng)用程序還是崩潰了(即使我設(shè)置了 MinGW 的選項(xiàng) -fexceptions).

But the application crashes anyway (even though I put the option -fexceptions of MinGW).

是否有可能捕獲這樣的異常(我理解這不是 C++ 異常,而是 FPU 異常)?

Is it possible to catch such an exception (which I understand is not a C++ exception, but a FPU exception) ?

我知道我可以在除法之前檢查除數(shù),但我假設(shè),因?yàn)槌粤闶呛币姷?至少在我的應(yīng)用程序中),它會更多嘗試除法(并在發(fā)生錯誤時(shí)捕獲錯誤)比在除法之前每次測試除數(shù)更有效.

I'm aware that I could check for the divisor before dividing, but I made the assumption that, because a division by zero is rare (at least in my app), it would be more efficient to try dividing (and catching the error if it occurs) than testing each time the divisor before dividing.

我正在 WindowsXP 計(jì)算機(jī)上進(jìn)行這些測試,但希望使其跨平臺.

I'm doing these tests on a WindowsXP computer, but would like to make it cross platform.

推薦答案

這也不例外.這是一個錯誤,它在硬件級別確定并返回給操作系統(tǒng),然后操作系統(tǒng)以某種特定于操作系統(tǒng)的方式通知您的程序(例如,通過殺死過程).

It's not an exception. It's an error which is determined at hardware level and is returned back to the operating system, which then notifies your program in some OS-specific way about it (like, by killing the process).

相信在這種情況下發(fā)生的不是異常而是信號.如果是這種情況:操作系統(tǒng)會中斷您程序的主控制流并調(diào)用信號處理程序,從而終止程序的運(yùn)行.

I believe that in such case what happens is not an exception but a signal. If it's the case: The operating system interrupts your program's main control flow and calls a signal handler, which - in turn - terminates the operation of your program.

這與取消引用空指針時(shí)出現(xiàn)的錯誤類型相同(然后您的程序因 SIGSEGV 信號而崩潰,分段錯誤).

It's the same type of error which appears when you dereference a null pointer (then your program crashes by SIGSEGV signal, segmentation fault).

您可以嘗試使用 <csignal> 標(biāo)頭中的函數(shù)來嘗試為 SIGFPE 信號提供自定義處理程序(它用于浮點(diǎn)異常,但也可能是這種情況整數(shù)除以零 - 我在這里真的不確定).但是,您應(yīng)該注意信號處理依賴于操作系統(tǒng),并且 MinGW 以某種方式模擬"了 Windows 環(huán)境下的 POSIX 信號.

You could try to use the functions from <csignal> header to try to provide a custom handler for the SIGFPE signal (it's for floating point exceptions, but it might be the case that it's also raised for integer division by zero - I'm really unsure here). You should however note that the signal handling is OS-dependent and MinGW somehow "emulates" the POSIX signals under Windows environment.

這是在 MinGW 4.5、Windows 7 上的測試:

Here's the test on MinGW 4.5, Windows 7:

#include <csignal>
#include <iostream>

using namespace std;

void handler(int a) {
    cout << "Signal " << a << " here!" << endl;
}

int main() {
    signal(SIGFPE, handler);
    int a = 1/0;
}

輸出:

信號 8 在這里!

在執(zhí)行信號處理程序后,系統(tǒng)立即終止進(jìn)程并顯示錯誤消息.

And right after executing the signal handler, the system kills the process and displays an error message.

使用此功能,您可以在除以零或空指針取消引用后關(guān)閉任何資源或記錄錯誤...但與異常不同,即使在特殊情況下,也不能控制程序流程. 一個有效的程序不應(yīng)該這樣做.捕獲這些信號僅用于調(diào)試/診斷目的.

Using this, you can close any resources or log an error after a division by zero or a null pointer dereference... but unlike exceptions that's NOT a way to control your program's flow even in exceptional cases. A valid program shouldn't do that. Catching those signals is only useful for debugging/diagnosing purposes.

(有一些有用的信號通常在低級編程中非常有用,并且不會導(dǎo)致您的程序在處理程序之后立即被殺死,但這是一個很深的話題).

這篇關(guān)于C++:捕捉除以零錯誤的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數(shù)據(jù)?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫 for() 循環(huán): for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環(huán)?)
Reusing thread in loop c++(在循環(huán) C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環(huán)形?)
主站蜘蛛池模板: 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | SF6环境监测系统-接地环流在线监测装置-瑟恩实业 | 无锡不干胶标签,卷筒标签,无锡瑞彩包装材料有限公司 | 福建成考网-福建成人高考网| 广州工业氧气-工业氩气-工业氮气-二氧化碳-广州市番禺区得力气体经营部 | 飞象网 - 通信人每天必上的网站| 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 桑茶-七彩贝壳桑叶茶 长寿茶 | 冷镦机-多工位冷镦机-高速冷镦机厂家-温州金诺机械设备制造有限公司 | 昆明挖掘机修理厂_挖掘机翻新再制造-昆明聚力工程机械维修有限公司 | 代理记账_免费注册公司_营业执照代办_资质代办-【乐财汇】 | 翅片管换热器「型号全」_厂家-淄博鑫科环保 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 液氨泵,液化气泵-淄博「亚泰」燃气设备制造有限公司 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 5nd音乐网|最新流行歌曲|MP3歌曲免费下载|好听的歌|音乐下载 免费听mp3音乐 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 媒介云-全网整合营销_成都新闻媒体发稿_软文发布平台 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | POM塑料_PBT材料「进口」聚甲醛POM杜邦原料、加纤PBT塑料报价格找利隆塑料 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 | 布袋除尘器-单机除尘器-脉冲除尘器-泊头市兴天环保设备有限公司 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 自动气象站_气象站监测设备_全自动气象站设备_雨量监测站-山东风途物联网 | 拉伸膜,PE缠绕膜,打包带,封箱胶带,包装膜厂家-东莞宏展包装 | 山东成考网-山东成人高考网 | 耐磨陶瓷,耐磨陶瓷管道_厂家-淄博拓创陶瓷科技 | 屏蔽服(500kv-超高压-特高压-电磁)-徐吉电气 | HDPE储罐_厂家-山东九州阿丽贝防腐设备 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 心得体会网_心得体会格式范文模板 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | 智能终端_RTU_dcm_北斗星空自动化科技 |