C++异常处理建议收藏

一C++异常处理机制异常处理基本思想:执行一个函数的过程中发现异常,可以不用再本函数内立即进行处理,而是抛出该异常,让函数的调用者直接或间接的处理这个问题。C++异常处理进制由三个模块组成:tr

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

一 C++异常处理机制

  异常处理基本思想:执行一个函数的过程中发现异常,可以不用再本函数内立即进行处理,而是抛出该异常,让函数的调用者直接或间接的处理这个问题。

  C++异常处理进制由三个模块组成:try、throw、catch

  try—catch基本语法:

try 
 { 
可能抛出异常的语句;(检查) 
} 
catch(类型名[形参名])//捕获特定类型的异常 
{ 
 //处理1; 
} 
catch(类型名[形参名])//捕获特定类型的异常 
{ 
 //处理2; 
} 
catch(…)//捕获所有类型的异常 
{ 
 } 

   示例:

void f1(int i)
{
    if (i<0)
        throw 1;
}
void f2()
{
    f1(-45);
}
void f3()
{
    f2();
}
void f4()
{
    f3();
}
int main()
{
    try{
        f4();
    }
    catch (int i)
    {
        cout <<"error code:"<< i <<"\n"<< endl;
    }
    system("pause");
    return 0;
}

二 异常捕获的匹配规则

  try块里面抛出哪种异常,则catch里面捕获哪种类型的异常,一般情况下,类型必须完全匹配,但以下三种情况可以进行类型转换:

  (1)运行从非const对象到const对象转换,即throw一个非const对象,catch一个const对象

  (2)运行从派生类类型到基类型的转换

  (3)将数组转换为数组类型的指针,函数转换为指向函数类型的指针

#include <math.h>

bool Equal(double num1, double num2)
{
    if (num1 - num2 > -0.0000001 &&
        num1 - num2 < 0.0000001)
    {
        return true;
    }
    else
    {
        return false;
    }
}

// 基数为base为double类型,exponent为整数
double Power(double base, int exponent) // throw(char *)
{
    // 当底数为0且指数为负数时抛出异常
    if (Equal(base,0.0) && (exponent < 0))
    {
        throw exception("base must be positive!"); // thror "error"
    }
    double dbResult = 1.0;
    if (exponent >= 1)
    {
        for (int i = 0; i < exponent; i ++)
        {
            dbResult *= base;
        }
    }
    else if (exponent < 0)
    {
        for (int j = 0; j < abs(exponent); j ++)
        {
            dbResult *= base;
        }
        dbResult = 1/dbResult;
    }
    else if(exponent == 0)
    {
        dbResult = 1;
    }
    return dbResult;
}

void main()
{
    clock_t start,end;
    start = clock();
    try
    {
        cout << Power(0,1) << endl;
        cout << Power(2, 3) << endl;
        cout << Power(-2, 3) << endl;
        cout << Power(2, -3) << endl;
        cout << Power(2, 0) << endl;
        cout << Power(0,-1) << endl;
    }
    catch (exception & e) // char *p
    {
        cout << e.what() << endl;  // cout << p << endl;
    }
    end = clock();
    cout << "程序运行时间:" << (double)(end - start) / CLOCKS_PER_SEC << endl;
    return;
}

三 异常规范

  (1)函数声明之后,列出函数可能抛出的异常类型,并保证该函数不会抛出其他类型的异常

    a. void fun() throw(toobig,toosmall,divzero); // 函数抛出指定异常

    b. void f();  // 这意味函数会抛出任何一种异常

    c. void f() throw();   // 这意味函数不会抛出异常

  (2) 保证不在构造函数中抛出异常,因为构造函数的作用是构造对象并初始化,一旦抛出异常,有可能导致对象不完整或没有完全初始化

  (3)保证不在析构函数中抛出异常,因为析构函数的作用是完成资源的清理,一旦抛出异常,有可能导致内存泄露等等

四 使用异常的开销

  当异常被抛出时有相当的运行时间方面的开销,这就是从来不想把异常用于普通流控制的一部分的原因,而不管它多么令人心动。设计异常处理的重要目标之一是:在异常处理实现中,当异常不发生时应不影响运行速度,这就是说,只要不抛出异常,代码的允许速度如同没有加载异常处理一样,无论与否,异常处理都依赖于使用的特定编译器,异常处理会引出额外信息,这些信息被编译器置于栈上。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120165.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • (五)通俗易懂理解——双向LSTM

    (五)通俗易懂理解——双向LSTM中文翻译作者博客:https://www.cnblogs.com/wangduo/p/6773601.html?utm_source=itdadao&utm_medium=referral英文原文作者网址:http://colah.github.io/posts/2015-08-Understanding-LSTMs/参考相关网址:https://www.imooc.com/art…

    2022年6月29日
  • 十个拿来就能用的网页炫酷特效

    十个拿来就能用的网页炫酷特效之前喜欢收集能美化网页的代码,比如给网页加个背景啦,给鼠标加个特效啦,来来回回也收集到了一些“使用简单”,“效果爆炸”的页面,给大家陆续分享出来,如果觉得有帮助可以点赞收藏支持一下,如果能关注一下就再好不过了ヾ(≧▽≦*)o

    2022年7月26日
  • 订阅消息失败_无法进入苹果订阅页面

    订阅消息失败_无法进入苹果订阅页面”此电子邮件中的视图快照无法正确呈现。”如果您接收的订阅出现此错误消息,可能是由以下几种原因导致的:缺失凭据:某些视图在发布时具有嵌入的凭据。如果嵌入式凭据现已过时或视图在重新发布时未包含嵌入式凭据,则您可能会收到以上错误消息。数据库暂时瘫痪:如果视图具有实时数据库连接,且数据库在生成订阅时暂时瘫痪,则您可能会收到以上错误消息。后台进程超时:默认情况下,对于视图的呈现,处理订阅的后台进程的每个视图…

    2022年8月12日
  • noip2012借教室_noip小学组

    noip2012借教室_noip小学组这个题首先很容易想到枚举1-m,再一个一个加起来,判断一下(最直白的暴力)于是又很容易想到用差分数组可以优化一下。就像这样#include<iostream>#include<cstdio>usingnamespacestd;constintmaxn=1000005;intd[maxn],s[maxn],t[maxn],r[maxn];…

    2022年8月22日
  • Dos攻击原理_防止xss攻击方法

    Dos攻击原理_防止xss攻击方法Technorati标签: DoS,攻击,网络防御,TCP,SYN_FloodTCP/IP协议的权限DoS(拒绝服务攻击)—–DenialofService该攻击的原理是利用TCP报文头来做的文章.下面是TCP数据段头格式。SourcePort和DestinationPort:是本地端口和目标端口SequenceNu

    2022年10月1日
  • Reaver 基本用法示例「建议收藏」

    Reaver 基本用法示例「建议收藏」airmon-ngstartwlan0//启动mon0监控reaver-imon0-bMAC-a-S-vv//普通用法如果,90.9%进程后死机或停机,请记下PIN前四位数,用指令:reaver-imon0-bMAC-a-vv-pXXXX(PIN前四位数)其他命令airodump-ngmon0用来扫描周围无线信号wash-imo

    2022年5月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号