c++异常捕获及异常处理try-throw-catch

一直以来,我对c++的异常捕获功能非常困惑。

因为网上几乎99%的关于c++异常捕获的文章给我的感觉就是:

c++异常捕获很简单的啦~就是下面这样嘛,如下骂人

情景1:

try
{
    int a = 5, b = 0, c = 0;
    c = a / b;    // 这里异常
}
catch(...)        // 捕获所有异常
{
    printf_s("Do not do this!\n");
}

情景2:

try
{
    int a = 5, b = 0, c = 0;
    if (b == 0) throw "Error: Divided by zero!";
     c = a / b;    // 这里异常
}
catch(char *str)        // 捕获所有异常
{
    printf_s("%s\n", str);
}

情景3:

使用标准异常类

try  
    {  
        int* myarray= new int[100000];  
    }  
    catch (exception& e)  
    {  
        cout << "Standard exception: " << e.what() << endl;  
    }  

情景4:

高级一点的,使用自定义的异常类

//可以自己定义Exception  
class myexception: public exception  
{  
    virtual const char* what() const throw()  
    {  
        return "My exception happened";  
    }  
}myex;  
  
int main () {  
    try  
    {      
        if(true)    //如果,则抛出异常;  
            throw myex;  
    }  
    catch (exception& e)  
    {  
        cout << e.what() << endl;  
    }  
    return 0;  
} 

今天突然对c++异常捕获感兴趣,然后就在网上进行了大量搜索,搜索目标大概就是百度、CSDN和Microsoft网站上相关文档。

搜索到的文章内容基本上如上所述,看得我一头雾水。并不是说以上代码有什么问题,只是单纯靠这几行代码可能并不能达到预期效果。因为我是菜鸟,一直不太注重异常捕获和异常处理,对异常捕获这一块更是没怎么用过,而且我天真的以为只要认真写代码就不会有很大的问题,事实证明这确实是一个很天真的想法。

上面的代码我都能看懂,也知道他们的意思,我也觉得“哇,这么简单?”

可是,当我在VS上新建一个工程,把 情景1 的代码写上去然后 F5 后,发生的事情并不是我想象的那样,“Do not do this!" 并没有输出。

好困惑!!!不是说把异常代码写到 try 就能 catch 到吗?为什么没有呢?骗子!!!

那到底是为什么呢?

经过我再次大量搜索,发现了看似很关键的信息,说要修改项目配置,修改步骤如下:

项目->属性->配置属性->C/C++->代码生成,”启用C++异常“选项修改为 /EHa

我设置好之后再运行,发现在  debug 模式的时候是捕获成功了,但 release 模式的时候捕获失败。

然后,我写另外一段代码:

try
{
    int *p = NULL;
    *p = 1;    // 这里异常
}
catch(...)        // 捕获所有异常
{
    printf_s("Do not do this!\n");
}

运行后,发现 debug 和 release 模式都能捕获到,输出了“Do not do this!"


对于情景2,我也感觉很困惑。既然要用 if 来判断除数 b 是否为 0,为什么还要 throw 然后到 catch 里面处理?直接在 if 后面处理不好吗?难道是为了自定义异常类统一管理这些异常的处理?

还有一点,只要用了 throw 不管“启用c++异常”设置为什么都会 catch 到 throw 抛出的异常。这一点好理解,这是属于你主动(或者是强制)让它抛出的异常。不知道这样理解对不对,本人小菜鸟一个,不对请留言。


从以上所述可以得出结论:

1、在VS中写代码,c++的try-catch要捕获到“除数为0”和“使用NULL指针”,需要将“启用c++异常”设置为 /EHa;

2、“除数为0”和“使用NULL指针”这两种异常的区别导致c++的try-catch捕获的结果不一样;

3、debug和release两种模式对c++的try-catch也是有影响的;

4、在 try 中用 throw 抛出异常是一定可以捕获到的;


困惑:

1、为什么“除数为0”的异常在  debug 模式的时候是捕获成功了,但 release 模式的时候却捕获失败了?

2、在同样的配置下,是什么原因导致“除数为0”和“使用NULL指针”这两种异常的捕获结果不一样的?

3、throw 到底是为何而设计的?


哪位大神来讨论一下上述问题,或者能解答我上述困惑欢迎留言,谢谢了!!


参考链接:

https://docs.microsoft.com/zh-cn/cpp/cpp/try-throw-and-catch-statements-cpp

https://zhidao.baidu.com/question/263926694.html

https://blog.csdn.net/woshiyuanlei/article/details/51075020


  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C++中,可以使用 `try`、`catch` 和 `throw` 语句来进行异常处理异常是一种程序中的错误或意外情况,可以在运行时引发并且通常会导致程序停止执行。异常处理机制可以帮助我们优雅地处理这些意外情况,而不是直接终止程序。 下面是一个示例程序,演示了如何使用异常处理机制: ```c++ #include <iostream> using namespace std; int main() { int numerator, denominator, result; cout << "Enter the numerator: "; cin >> numerator; cout << "Enter the denominator: "; cin >> denominator; try { if (denominator == 0) { throw runtime_error("Divide by zero exception!"); } result = numerator / denominator; cout << "Result = " << result << endl; } catch (const exception& e) { cout << "Exception: " << e.what() << endl; } return 0; } ``` 在上面的代码中,我们首先输入两个数字,然后将它们相除并将结果存储在变量 `result` 中。如果分母为零,则会抛出一个 `runtime_error` 异常。在 `try` 块中,我们执行除法操作并打印结果。如果发生异常,则会跳转到 `catch` 块并打印异常信息。无论是否发生异常,程序都会继续执行并在最后返回0。 注意,在 `catch` 块中,我们使用了 `const exception& e` 的语法来捕获异常对象。这是因为在 C++ 中,异常对象实际上是通过引用传递的,而不是通过值传递的。因此,我们需要使用引用来捕获异常对象,以便在 `catch` 块中对其进行处理。 总之,异常处理机制可以帮助我们优雅地处理程序中的错误和意外情况,并且可以提高程序的健壮性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值