C# 图解教程 第5版 —— 第23章 异常

文章目录

    • 23.1 什么是异常
    • 23.2 try 语句
    • 23.3 异常类
    • 23.4 catch 子句
    • 23.5 异常过滤器
    • 23.6 catch 子句段
    • 23.7 finally 块
    • 23.8 为异常寻找处理程序
    • 23.9 进一步搜索
      • 23.9.1 一般法则
      • 23.9.2 搜索调用栈的示例(*)
    • 23.10 抛出异常
    • 23.11 不带异常对象的抛出
    • 23.12 throw 表达式

23.1 什么是异常

​ 异常是程序中的运行时错误,它违反了系统约束或应用程序约束,或是正常操作时不会发生的状况。如果程序没有提供处理异常的代码,系统会挂起这个程序。例如,下面的代码在试图用 0 除一个数时抛出一个异常:

image-20240113130921192 image-20240113130931943

​ 在没有异常处理程序的情况下,应用程序将停止(或者崩溃),并向用户显示非常不友好的错误消息。异常处理的目标是通过以下操作来响应异常:

  1. 在有限的几种情况下采取纠正措施,让应用程序继续运行。
  2. 记录有关异常的信息,以便开发团队可以解决该问题。
  3. 清理任何外部资源,例如可能保持打开的数据库连接。
  4. 向用户显示友好的信息。

23.2 try 语句

​ try 语句用来指明为避免出现异常而被保护的代码段,并在发生异常时提供代码处理。其包含 3 个部分组成:

  1. try 块。
  2. catch 子句。
  3. finally 块。
image-20240113131311982
图23.1 try 语句的结构

处理异常

​ 将上述代码段放在一个 try 块中,并提供一个简单的 catch 子句来捕获并处理异常。

image-20240113131404143 image-20240113131414697

23.3 异常类

​ BCL 定义了许多异常类,每一个类代表一种指定的异常类型。当一个异常发生时,CLR 创建该类型的异常对象并寻找适当的 catch 子句以处理它。

​ 所有异常类都派生自 System.Exception 类,System.Exception 类派生自 System.Object 类。

image-20240113131616192
图23.2 异常层次的结构

​ 异常对象含有只读属性,该属性提供有助于调试应用程序的异常信息。

表23.1 异常对象的一部分属性
image-20240113131830423

23.4 catch 子句

​ catch 子句处理异常,有如下 4 种形式:

image-20240113131923698
图23.3 catch 子句的 4 种形式
  • 一般 catch 子句(形式 1):能接受任何异常,但不确定引发异常的异常类型,只能进行普通处理和清理。
  • 特定 catch 子句(形式 2):把一个异常类的名称作为参数,匹配指定类或派生自它的异常类的异常。
  • 带对象的特定 catch 子句(形式 3、4):提供的异常信息最多,可以在 catch 子句块内部访问异常变量的属性,以获取异常的详细信息。
image-20240113132339051

23.5 异常过滤器

​ 形式 4 的 catch 子句是在 C# 6.0 中添加的,相较于形式 3,异常对象还需满足特定条件,该条件被称为过滤器。这允许程序员编写更小、更专一的异常处理程序,而无需再单个处理程序中包含大量 if 语句。

image-20240113132555826

​ 有关 when 子句的重要特征如下:

  • 必须包含谓词表达式(返回值为 true 或 false)。
  • 不能是异步的。
  • 不应使用任何需要长时间运行的操作。
  • 谓词表达式中发生的异常会被忽略。

23.6 catch 子句段

​ catch 子句段可以包含多个 catch 子句。

image-20240113133131889
图23.4 try 语句的 catch 子句段结构

​ 当发生异常时,系统按顺序搜索 catch 子句的列表,第一个匹配该异常对象类型的 catch 子句被执行。

  • catch 子句必须以特定顺序排列。最特定的异常类型排第一,最普通的类型排最后。
  • 如果有一个一般 catch 子句,则必须放在最后一个。
  • 不鼓励使用一般 catch 子句,因为它允许程序继续执行从而隐藏了特定错误,让程序处于一种位置的状态。

23.7 finally 块

​ 如果程序的控制流进入了带 finally 块的 try 语句,那么 finally 始终会被执行。

image-20240113133444181
图23.5 finally 块的执行

​ 即是 try 块中有 return 语句,或在 catch 块中抛出一个异常,finally 块也总是会在返回到调用代码之前执行。

image-20240113133744787

​ 上述代码在 inVal 值为 5 时也会打印 finally 块中的语句。

image-20240113133821319

23.8 为异常寻找处理程序

​ 当程序抛出异常时,系统查看该程序是否提供了异常处理程序,具体流程如下:

  • 如果在 try 块内发生了异常,系统会查看是否有任何一个 catch 子句能处理该异常。
  • 如果找到了适当的 catch 子句:
    1. 该 catch 子句被执行。
    2. 如果有 finally 块,那么它被执行;否则,继续在最后一个 catch 子句之后执行。
image-20240113134246204
图23.6 在当前 try 语句中有处理程序的异常

23.9 进一步搜索

​ 如果异常在一个没有被 try 语句保护的代码段抛出,或者如果 try 语句没有匹配的异常处理程序,系统将不得不进一步寻找匹配的处理程序。即,按顺序搜索调用栈,查看是否存在带匹配的处理程序的封装 try 块。

​ 如果异常发生在 Method2 内的 try 块内部,系统会执行如下操作:

  1. 首先查看 Method2 是否有能处理该异常的异常处理程序:
    • 如果有,Method2 处理,程序继续执行。
    • 否则,系统沿着调用栈找到 Method1,搜寻适当的处理程序。
  2. 如果 Method1 有一个适当的 catch 子句,那么系统将:
    • 回到栈顶,即 Method2 处。
    • 执行 Method2 的 finally 块,并将 Method2 弹出栈。
    • 执行 Method1 的 catch 子句和 finally 块。
  3. 如果 Method1 没有适当的 catch 子句,系统继续搜索调用栈。
image-20240113134534938
图23.7 搜索调用栈

23.9.1 一般法则

image-20240113134928143
图23.8 处理异常的一般法则

23.9.2 搜索调用栈的示例(*)

23.10 抛出异常

​ 使用 throw 语句使代码显示抛出异常,throw 语句的语法如下:

image-20240113135129478

​ 下面的代码在 try 块中进行参数 null 检查,创建并抛出 ArgumentNullException 异常。该实例在 catch 语句中被捕获,错误被打印出来。

image-20240113135200880 image-20240113135423860

23.11 不带异常对象的抛出

​ throw 语句可以在 catch 块内部不带异常对象使用。

  • 该形式重新抛出当前异常,系统会继续搜索,为该异常寻找另外的处理程序。
  • 这种形式只能用在 catch 语句内部。
image-20240113135559476 image-20240113135607676

23.12 throw 表达式

​ 代码中有些地方不允许使用语句,而只能使用表达式。C# 7.0 后,可以在只能应用表达式的地方使用 throw 表达式,其语法和 throw 语句相同。

image-20240113135912305 image-20240113135925872

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/236849.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI视野·今日NLP 自然语言处理论文速览 第七十二期】Mon, 8 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 8 Jan 2024 Totally 17 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers DeepSeek LLM: Scaling Open-Source Language Models with Longtermism Authors DeepSeek AI Xiao Bi, Deli Ch…

Spirng MVC见解1

1. SpringMVC概述 1.1 MVC介绍 MVC是一种设计模式,将软件按照模型、视图、控制器来划分: M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为数据承载Bean&#x…

初学unity学习七天,经验收获总结

初学unity七天,经验收获总结 学习就是认识新观念和新想法的过程。 假如人们始终以同一种思维方式来考虑问题的话,那么始终只会得到同样的结果。 因为我对你讲述的许多内容是你以前从未接触过的,所以我建议你,在你还没有做之前&…

Matlab 使用 DH table 建立的 robot 和实际不符

机器人仿真 想借助 matlab robotics toolbox 来仿真机器人,但是直接输入自己的 DH table 显示出来的 robot 和实际不情况不符。 DH table 建立 robot Build Manipulator Robot Using Kinematic DH Parameters 主要使用 setFixedTransform,DH table 中…

Centos报错failovermethod 和 appstream

Centos报错failovermethod 和 appstream 报错failovermethod 编辑/etc/yum.repos.d/CentOS-Epel.repo vim /etc/yum.repos.d/CentOS-epel.repo将failovermethod选项删除即可 报错appstream 参考这篇文章:https://blog.csdn.net/weixin_46533577/article/details…

重学Java 3 变量 数据类型转换 运算符

路上难免会有许多挫折,你要学会应对,要坚不可摧 ——24.1.12 一、常量 1.概述:在代码的运行过程中,值都不会发生改变的数据 2.分类: 整数常量:所有整数,包含正负 小数常量:所有带小数…

2-认识小程序项目

基本结构 myapp├─miniprogram┊ └──pages┊ ┊ └──index┊ ┊ ┊ ├──index.json┊ ┊ ┊ ├──index.ts┊ ┊ ┊ ├──index.wxml┊ ┊ ┊ └──index.wxss┊ ┊ └──logs┊ ┊ ├──index.json┊ ┊ ├──index.ts┊ ┊ ├…

第 3 章 Keepalived 双机热备

技能展示: 会构建双机热备系统 会构建 LVSHA 高可用群集 在这个高度信息化的 IT 时代,企业的生产系统、业务运营、销售和支持,以及日常管理等环节越来越依赖于计算机信息和服务,对高可用(HA)技术的应用需求…

C++力扣题目98--验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入…

bootloader学习笔记及SD卡启动盘制作

Bootloader介绍 在操作系统运行之前运行的一小段代码,用于将软硬件环境初始化到一个合适的状态,为操作系统的加载和运行做准备(其本身不是操作系统) Bootloader基本功能 1、初始化软硬件环境 2、引导加载linux内核 3、给linux…

深入了解static关键字的作用和应用--java面向对象学习

Static修饰成员变量 Static是什么 叫静态,可以修饰成员变量,成员方法 成员变量按有无static修饰分俩种: 类变量:有static修饰,属于类,在计算机里只有一份,会被类的全部对…

CCF模拟题 202309-2 坐标变换(其二)

问题描述 试题编号: 202309-2 试题名称: 坐标变换(其二) 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 对于平面直角坐标系上的坐标 (x,y),小 P 定义了如下两…

Web开发:SQLsugar的安装和使用

一、安装 第一步,在你的项目中找到解决方案,右键-管理解决方案的Nuget 第二步,下载对应的包,注意你的框架是哪个就下载哪个的包,一个项目安装一次包即可 点击应用和确定 安装好后会显示sqlsugar的包 二、使用&#xf…

【前端转安卓】-Java基础知识笔记

常量定义:final public class HelloWorld {// 静态常量public static final double PI 3.14;// 声明成员常量final int y 10;public static void main(String[] args) {// 声明局部常量final double x 3.3;} }变量声明、赋值 String username,address,phone,te…

C++力扣题目513找树左下角的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 思路 本题要找出树的最后一行的最左边的值。此时大家应该想…

odoo17 | Qweb模板简介

前言 到目前为止&#xff0c;我们的房地产模块的界面设计还相当有限。构建列表视图很简单&#xff0c;因为只需要字段列表。表单视图也是如此&#xff1a;尽管使用了几个标签&#xff0c;如 <group>标签或 <page>标签 &#xff0c;但在设计方面几乎没什么可做的。…

开通微信商家转账到零钱怎么做?场景模板

商家转账到零钱是什么&#xff1f; 商家转账到零钱功能是指商家可以通过支付平台将资金直接转账到用户的零钱账户中。在这种情况下&#xff0c;商家不需要用户提供银行账户信息&#xff0c;而是使用支付平台的转账功能将资金直接转移到用户的零钱账户中。 商家转账到零钱的使…

【前后端的那些事】treeSelect树形结构数据展示

文章目录 tree-selector1. 新增表单组件2. 在父组件中引用3. 父组件添加新增按钮4. 树形组件4.1 前端代码4.2 后端代码 前言&#xff1a;最近写项目&#xff0c;发现了一些很有意思的功能&#xff0c;想写文章&#xff0c;录视频把这些内容记录下。但这些功能太零碎&#xff0c…

紫光展锐5G扬帆出海 | Blade系列勇当拉美5G先锋

5G对拉丁美洲&#xff08;简称“拉美”&#xff09;绝大多数消费者来说还是一个新鲜技术。GSMA报告显示&#xff0c;过去五年&#xff0c;拉美运营商在移动网络方面的资本开支大部分用于部署4G网络。但在5G网络方面拉美也在积极大力投入中&#xff0c;紧跟全球5G发展大潮&#…

企业微信forMAC,如何左右翻动预览图片

1、control commandshifd 进入企业微信的debug调试模式 2、按照如下步骤选择 3、重启企业微信