C++算法学习——预备知识(4)——异常处理(1)

Robomaster视觉教程(一)谈谈搞视觉应该会的C++知识 以下基本上是视觉入门opencv学习的最低标准,毕竟之后主要要讲的是计算机视觉方面的东西,其中的概念只是点到为止,希望大家可以将模糊的概念百度一下,最好也能总结一下,C++学习是基础中的基础,笔者会不定期更新和完善。(其中带*的内容为可选学内容) 一、预备知识(不分先后) 了解C++标准(C99、C11等)(视觉新手经常会遇到的错误往往不是opencv的,而是不熟悉IDE或者C++标准版本所致) 多文件编程(RM视觉部分的代码量也可以算是一个小项目,我们一般创建一个工程,在工程中使用头文件和源文件配合编 阅读详情

异常(Exceptions)

异常提供了一种通过将控制转移到名为处理程序的特殊功能来对我们程序中异常情况(如运行时错误)做出反应的方法。
要捕获异常,我们必须将一部分代码放在异常检查下。 这是通过将该部分代码包含在try块中来完成的。 当该块中出现异常情况时,抛出异常,将异常处理程序传递给控件。如果没有抛出异常,代码将继续正常运行,所有处理程序都将被忽略。
使用try块内的throw关键字抛出异常。异常处理程序用关键字catch声明,它必须在try块之后立即放置。异常处理下的代码包含在try块中。
下面我们分别解释一下这三个keyword:

  • try :块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。当该块中出现异常情况时,抛出异常,将异常处理程序传递给控件。
  • throw:当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。引发异常
  • catch:英文直译为捕获,用于声明异常处理程序,当try语句中的特定的异常代码标识被触发时,执行这里的代码,因此紧跟try后面。

throw使用示例

throw 语句在代码块中的可以在任何地方抛出异常。throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。比如我们都知道的常识,被除数不能为0,如果用户输入的话我们可以直接抛出异常,我们很自然可以想到在 if 语句后面加 throw。

double division(int a, int b)
{
   if( b == 0 )
   {
      throw "Division by zero condition!";
   }
   return (a / b);
}

但是这样的运行我们肯定有疑问,因为throw不是cout,这里的函数返回类型是double不是我们的字符串,所以我们的直接throw是不会有反应的,编译器会编译出错。我们可以写个代码试试:

#include <iostream>
using namespace std;
double division(int a, int b);
int main(){
    double z = division(4,0);
    cout << z;
    return 0;
}
double division(int a, int b)
{
   if( b == 0 )
   {
      throw "Division by zero condition!";
   }
   return (a / b);
}

运行结果是这样的:
这里写图片描述
那么是不是我们用法有问题?当然不是!等会我们就来解决这个问题!

try, catch 的配对使用

常规的使用格式如下:

try
{
   // 保护代码
}catch( ExceptionName e )
{
  // 处理 ExceptionName 异常的代码
}

ExceptionName 指的是异常的类型,可以为int型 也可以为 double,char等等,例如下面的一个简单的例子:

#include <iostream>
using namespace std;

int main () {
  try
  {
    throw 20;
  }
  catch (int e) //ExceptionName 的类型是int,注意我们这个时候并没有用throw而是cout
  {
    cout << "An exception occurred. Exception Nr. " << e << endl;
  }
  return 0;
}

运行结果:
这里写图片描述
异常处理程序用catch关键字声明。你可以看到,它立即跟随try块的关闭括号。 捕获格式类似于始终至少有一个参数的常规函数。此参数的类型非常重要,因为通过throw表达式传递的参数的类型与之匹配,只有在匹配的情况下,才会捕获异常。(这就是为什么我们前面会报错

我们可以链接多个处理程序(catch表达式),每个处理程序具有不同的参数类型。 只有匹配其类型的处理程序才能执行在throw语句中指定的参数。
如果我们使用省略号(…)作为catch的参数,该处理程序将捕获任何异常,无论抛出异常的类型是什么。这可以用作一个默认处理程序,它捕获最后指定的其他处理程序未捕获的所有异常:

try {
  // 代码
}
catch (int param) { cout << "int exception"; }
catch (char param) { cout << "char exception"; }
catch (...) { cout << "default exception"; }

在这种情况下,最后一个处理程序将捕获任何不是int和char的参数抛出的异常。在处理异常之后,程序执行会在try-catch块之后恢复,而不是在throw语句之后!也可以将try-catch块嵌套在更多的外部try块中。 在这种情况下,我们有可能内部catch块将异常转发到外部级别。这是用表达式throw来完成的,没有throw的内容。例如:

try {
  try {
      // code here
  }
  catch (int n) {
      throw;
  }
}
catch (...) {
  cout << "Exception occurred";
}

现在我们来解决上面的throw问题:

#include <iostream>
using namespace std;
int main(){
    while(true){
    double a, b;
    cin >> a >> b;
    //在这里 try里面放置的是可能出现异常的代码,我们也称为保护代码 
    try{
        if(b == 0) throw "抛出异常,被除数为0";
        double z = a / b;
        cout << z << endl; 
    }catch(const char* msg){   /*catch紧跟在try后面,我们抛出的异常是个字符串
                                *所以为const char类型的指针,我们抛出的异常是
                                *被储存在名为msg的字符数组中,然后用char型指针
                                *逐个输出我们抛出的内容
                                */ 
        cerr << msg << endl; 
    }
}
    return 0;
}

当我们的输入的数字中,被除数不为0的时候,程序就不会执行try-catch语句,而是正常运行,当触发时,catch语句就捕获这类的错误,抛出我们的内容:
这里写图片描述

多catch程序示例

下面我们来看一段测试代码:

/*
 *这段代码是我为了深入体会 try - catch语句所写
 *展示的原理是,我们catch的内容是指的我们抛出的内容类型
 *这里我们输入一个char值,然后我们判断各种类型,抛出不同的异常
 *最后实现多个catch的不同反应
 */ 
#include <iostream>
#include <cctype>
using namespace std;
int main(){
    while(true){
    char b;
    cin >> b;
    try{
        if(isdigit(b)) throw 0;
        if(isupper(b)) throw 'a';
        if(islower(b)) throw " lower char";
        /*下面的代码根据抛出的不同的异常类型,做出相应的输出*/ 
    }catch(int e){   
        cout << "int exception" << endl;
    }catch(char e){
        cout << "char exception" << endl;
    }catch(...){ //因为我们没有定义catch字符串类型的异常所以省略号会帮我们完成这部分处理
        cout << "default exception" << endl; 
    }
 }
    return 0;
}

运行结果如下:
这里写图片描述

C++】从代码示例入手(一)预备知识 每一个代码示例都有详细的解释和注释,让你能轻松理解代码的功能和运行原理,助你逐步掌握 C++的编程技巧,快速提升编程能力,为后续深入学习和开发打下坚实基础。《C++代码示例入手》系列文章将带你开启 C++编程的探索之旅。,由浅入深地展现 C++的核心知识点, 阅读详情

相关推荐

C++ Primer学习指南:从语法基础到项目实战的完整路径

C++作为一门支持面向对象、泛型编程和系统级资源管理的编译型语言,其核心价值在于提供零开销抽象和高性能控制能力。理解C++的语法基础、内存管理模型和标准库组件是掌握这门语言的关键,这直接关系到开发高性能应用、系统软件和游戏引擎等场景的实现效率。通过系统学习C++的面向对象特性、模板元编程和智能指针等机制,开发者能够构建出既安全又高效的软件系统。本文以经典教材《C++ Primer》为线索,结合C++面试题和C++项目实践中的常见问题,详细拆解如何将书本知识转化为解决实际工程问题的能力,涵盖从环境配置、核心语

weixin_34050519的博客 317

算法

算法:是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作 算法五个基本特性:输入、输出、有穷性、确定性、可行性 输入:算法具有零个或多个输入 输出:算法至少有一个或多个输出 有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环, 并且每一个步骤在可接受的时间内完成 确定性:算法的每一个步骤都具有确定的含义,不会出现二义性 可行性:算...

fuge92的博客 349

【CUDA高级开发者学习路线图】预备知识模块

下面给出一套:让你可以直接复制粘贴运行,看到每一步的细节与性能差异,并能自行扩展。

u012133341的博客 144

计算机算法设计与分析期末复习

以下是我的部分算法笔记,希望可以给复习的小伙伴们参考一下

qq_58504094的博客 2364

《大话数据结构》笔记 第二章 算法(上)

介绍算法的定义、特性、设计要求和算法效率的度量方法

LinK 316

算法的时间复杂度

算法的时间复杂度 定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数T(n)称为这一算法的“时间复杂性”。当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。我们常用大O表示法表示时间复杂性,注意它是某一...

ankaodi7444的博客 652

异常处理 0810

异常处理的必要性 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。 程序设计的要求之一就是程序的健壮性。希望程序在运行时能够不出或者少出问题。但是,在程序的实际运行时,总会有一些因素导致程序不能正常运行。 在设计算法时,

m0_49184799的博客 212

1 C++ 学习预备知识

C++预备知识

South_Rosefinch的博客 1572

C++ Primer Plus 第1预备知识

Preface: 学习 C++ 是一次探索之旅,因为这种语言容纳了好几种编程范式,其中包括面向对象编程、泛型编程和传统的过程化编程。 为了系统地学习 C++ ,特鼓励自己坚持写此博客,博文会不断更新,若有不当或问题之处,望各位博友及时提出及指正。本书(或称本系列博客)讲述了 C++ 在 C 语言的基础上新增的很多特性 :类和对象 继承 多态、虚函数和 RTTI(运行阶段类型识别) 函数重载 引用变量

PzLu's Blog 533

CUDA 高级开发者学习路线图

代码】CUDA 高级开发者学习路线图。

u012133341的博客 2059

C++记录本人学习博客-汇总----一步步完善自己的知识体系

1C++系统学习路径博客记录 1C++学习-1(各种编译器,以及qt下使用qmake,cmake,linux下使用cmake管理) 2)C++学习 -2 namespace大全 3)C++学习 -3 C和C++的混合编程及库的调用 4C++学习 -4 查询C++标准库写应用层代码以filestream【缺少对标准库的解析】 5)C++学习-5 普查所有C++关键词对其全面了解(2万长文配合诸多案例进行讲解) 目前正在总结C++面向对象相关知识的总结,后面还有模板泛型相关的 2、C++项目源码介绍 1)

zw1996的博客 597

C++ Primer》(第5版)学习笔记(一)预备知识

学习笔记

weixin_41488105的博客 334

C++课程基础语法小结

前言 每个人的记忆是有限的,学过的东西很快就会遗忘,因此,在即将升大二之际,对大一学习C++的基础语法进行整理归纳,并附上一年里写过的一些重要代码,方便今后回顾! 声明:本文参考教材提供的网络学习资料(非常感谢,网址已注明),代码为博主本人大一时自己写的代码(作业、实验报告的题目),本人水平有限,代码不一定完美,欢迎帮忙指正!!! 教材 C++程序设计基础(第5版)(上) 附带学习网站...

浅若清风cyf的博客 1073

C++ Primer Plus》学习笔记0

Hello,World! 本书版本:《C++ Primer Plus(第6版)中文版》C++是在C语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言,是C语言的超集。本书是根据2003年的ISO/ANSI C++标准编写的。 本书内容18章+10附录)第1预备知识:本章介绍Bjarne Stroustrup如何通过在C语言的基础上添加面向对象编程的支持,来创造C...

weixin_34199405的博客 152

读书笔记1-C++ Primer Plus

C++是在C语言基础上开发的一种集面向对象编程(OOP)、通用编程和传统的过程化编程于一体的编程语言。本书是根据2003年的ISO/ANSI C++标准编写的,通过大量短小精悍的程序详细而全面地阐述了C++的基本概念和技术。

华数云图小分队的博客 1087

C++Primer Plus(6)学习第一天

1.**C++简介** C++是在C语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言,是C语言的超集。 包括18章和10个附录,介绍C++程序的运行方式、基本数据类型、复合数据类型、循环和关系表达式、分支语句和逻辑运算符、函数重载和函数模板、内存模型和名称空间、类的设计和使用、多态、虚函数、动态内存分配、继承、代码重用、友元、异常处理技术、string类和标准模板库、...

Rainbow 2万+

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 内容提要: C++是在C语言基础上开发的一种集面向对象编程、通用编程和传统的过程化编程于一体的编程语言,是C语言的超集。《C++ PrimerPlus中文版》由Stehpen Prata著,张海龙、袁国忠译:是根据2003年的ISO/ANSIC++标准编写的。通过大量短小精悍的程序详细而全面地阐述了C++的基本概

wangsh217的专栏 1万+
上一篇: C++算法学习——预备知识(3)——类模板
下一篇: C++算法学习——预备知识(5)——异常处理(2)
gzhosp_redAnt
博客等级 码龄10年 702粉丝 269原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值