C#,入门教程(36)——尝试(try)捕捉(catch)不同异常(Exception)的点滴知识与源代码

news2024/11/13 9:05:38

上一篇:

C#,入门教程(35)——哈希表(Hashtable)的基础知识与用法icon-default.png?t=N7T8https://blog.csdn.net/beijinghorn/article/details/124236243

1、try catch 错误机制


Try-catch 语句包含一个后接一个或多个 catch 子句的 try 块,这些子句指定不同异常的处理程序。

引发异常时,公共语言运行时 (CLR) 查找处理此异常的 catch 语句。 如果当前正在执行的方法不包含此类 catch 块,则 CLR 查看调用了当前方法的方法,并以此类推遍历调用堆栈。 如果未找到任何 catch 块,则 CLR 向用户显示一条未处理的异常消息,并停止执行程序。

try 块包含可能导致异常的受保护的代码。

The try catch statement contains a Try block followed by one or more catch clauses that specify different exception handlers.

When an exception is thrown, the common language runtime (CLR) looks for a catch statement that handles the exception. If the currently executing method does not contain such a catch block, the CLR checks the method that called the current method, and so on. If no catch block is found, the CLR displays an unhandled exception message to the user and stops executing the program.

The try block contains protected code that may cause exceptions.

尽管可以不带参数使用 catch 子句来捕获任何类型的异常,但不推荐这种用法。 一般情况下,只应捕获你知道如何从其恢复的异常。 因此,应始终指定派生自 System.Exception 的对象参数。 异常类型应尽可能具体,以避免不正确地接受异常处理程序实际上无法解决的异常。 因此,最好是在基 Exception 类型上使用具体的异常。

可以使用同一 try-catch 语句中的多个特定 catch 子句。 在这种情况下,catch 子句的顺序很重要,因为 catch 子句是按顺序检查的。 在使用更笼统的子句之前获取特定性更强的异常。 如果捕获块的排序使得永不会达到之后的块,则编译器将产生错误。

Although the catch clause can be used without parameters to catch any type of exception, this usage is not recommended. Generally, you should only catch exceptions from which you know how to recover. Therefore, object parameters derived from System.Exception should always be specified. The exception type should be as specific as possible to avoid incorrectly accepting exceptions that the exception handler cannot actually resolve. Therefore, it is better to use specific exceptions on the base Exception type.

You can use multiple specific catch clauses in the same try catch statement. In this case, the order of the catch clauses is important because the catch clauses are checked in order. Get more specific exceptions before using more general clauses. If the order of the captured blocks is such that the subsequent blocks are never reached, the compiler will generate an error.

筛选想要处理的异常的一种方式是使用 catch 参数。 也可以使用异常筛选器进一步检查该异常以决定是否要对其进行处理。 如果异常筛选器返回 false,则继续搜索处理程序。

异常筛选器要优于捕获和重新引发(如下所述),因为筛选器将保留堆栈不受损坏。 如果之后的处理程序转储堆栈,可以查看到异常的原始来源,而不只是重新引发它的最后一个位置。 异常筛选器表达式的一个常见用途是日志记录。 可以创建一个始终返回 false 并输出到日志的筛选器,能在异常通过时进行记录,且无需处理并重新引发它们。

可在 catch 块中使用 throw 语句以重新引发已由 catch 语句捕获的异常。 下面的示例从 IOException 异常提取源信息,然后向父方法引发异常。

One way to filter the exceptions you want to handle is to use the catch parameter. You can also use an exception filter to further examine the exception to determine whether to handle it. If the exception filter returns false, continue searching for handlers.

Exception filters are preferable to capture and rethrow (as described below), because the filter will keep the stack intact. If the subsequent handler dumps the stack, you can see the original source of the exception, not just the last location where it was re thrown. A common use of exception filter expressions is logging. You can create a filter that always returns false and outputs it to the log. It can record exceptions when they pass without processing and rethrowing them.

You can use a throw statement in a catch block to rethrow an exception that has been caught by a catch statement. The following example extracts the source information from the IOException exception, and then throws an exception to the parent method.

2、关于异常的一点细节问题

C# 的错误机制,try catch 除了可以捕捉常规的 Exception 异常,也可以捕捉到 系统定义的 自定义的 不同异常,并支持应用程序按不同的异常进行分别的处理。

using System;
using System.IO;

private void MultiExceptions(string filepath)
{
    try
    {
        // 文件的操作
        long isize;
        FileStream fs = File.Open(filepath, FileMode.Open);
        isize = fs.Length;
        fs.Close();
    }
    catch (UnauthorizedAccessException uex)
    {
        // 未授权的权限导致的异常
        MessageBox.Show(uex.Message);
    }
    catch (FileNotFoundException fex)
    {
        // 无文件导致的异常
        MessageBox.Show(fex.Message);
    }
    catch (NotSupportedException nex)
    {
        // 不支持操作的错误导致的异常
        MessageBox.Show(nex.Message);
    }
    catch (ArgumentException aex)
    {
        // 参数错误导致的异常
        MessageBox.Show(aex.Message);
    }
    catch
    {
        // 其他错误导致的异常
        MessageBox.Show("error occured!");
    }
}

下一篇:

C#,入门教程(37)——一个优秀程序员的修炼之道icon-default.png?t=N7T8https://blog.csdn.net/beijinghorn/article/details/125011644

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目:博客

1. 运行环境: 主机 主机名 系统 服务 192.168.223.129 Server_Web Linux Web 192.168.48.131 Server-NFS-DNS Linux NFS/DNS 2. 基础配置 配置主机名,静态IP地址 开启防火墙并配置 部分开启SElinux并配置 服务器之间使用同ntp.aliyun.com进行…

prometheus和alertmanager inhibit_rules抑制的使用

172.16.10.21 prometheus 172.16.10.33 altermanager 172.16.10.59 mysql服务,node探针以及mysql的探针 [rootk8s-node02 ~]# docker ps -a CONTAINER ID IMAGE …

SpringBoot+BCrypt算法加密

BCrypt是一种密码哈希函数,BCrypt算法使用“盐”来加密密码,这是一种随机生成的字符串,可以在密码加密过程中使用,以确保每次加密结果都不同。盐的使用增强了安全性,因为攻击者需要花费更多的时间来破解密码。 下图为…

深度剖析Sentinel热点规则

欢迎来到我的博客,代码的世界里,每一行都是一个故事 深度剖析Sentinel热点规则 前言核心概念解析:数字守护者的起源核心概念解析:简单示例演示: 参数索引:规则的基石参数索引的作用:不同场景下选…

数学建模-灰色预测模型

灰色预测练习解答 x(0){183,189,207,234,220,256,270,285}; X(1){183,372,579,813,1033,1289,1559,1844}; Matlab操作程序: x0[183,189,207,234,220,256,270,285];>> format long; %(表示设计精度)>> nlength(x0); %(输入数据长度)>&g…

在 python 中调用 C/C++

Python 是一种很好用的胶水语言,利用Python的简洁和C的高效,基本可以解决99%的问题了,剩下那 1% 的问题也就不是问题了,毕竟不是所有问题都可解。 一般的,Python和C的交互分为这两种情况: 用C扩展Python&…

标准化编程系列(常用模式状态介绍)

任何事情任何编程都是有方法可循的,我们所要做的工作就是在看似没有规律的运行中,发现规律总结一般性的方法。这篇博客主要介绍标准化编程相关的基础知识,编程化编程离不开大家扎实的编程基本功,所以在学习标准化的同时,大家需要提升对于子程序,模块FB 、FC等的应用知识,…

Windows11通过Hyper-V创建VM,然后通过vscode连接vm进行开发

这边需要在win11上建立vm来部署docker(这边不能用windows版本的docker destop),学习了下,记录。 下载系统镜像 首先下载系统镜像:https://releases.ubuntu.com/focal/ 这边使用的是ubuntu20.04.6 LTS (Focal Fossa) ,Server inst…

D4800——AB类立体声耳机放大芯片, 输出电压振幅大,电源抑制比好且低功耗, 工作温度范围宽 无开关噪声

D4800是一块AB类立体声耳机音频功率放大器电路。D480在5V电源时输出功率最高可290mW(89负裁失真度1090.适合在便携式数字音响设备中作功率放大用。 主要特点: ● 电源电压:单电源: 2V to 7V 双电源:1.0V to3.5V ● 高信噪比: 100dB DIP8. ● 转速快: 5V/us ● 失…

【乳腺肿瘤诊断分类及预测】基于PNN概率神经网络

课题名称:基于PNN的乳腺肿瘤诊断分类及预测 版本日期:2023-06-15 运行方式: 直接运行PNN0501.m 文件即可 代码获取方式:私信博主或QQ:491052175 模型描述: 威斯康辛大学医学院经过多年的收集和整理,建…

关于Spring框架的 @Configuration 与@Service 加载顺序哪个先后(某些环境加载是随机的)

很多资料都说Configuration 优先加载,Service后加载,如下图: 本来也是以为 Configuration 优先加载于 Service ,那参数处理放在Configuration注入完后,service构建时就可以拿来用的,在我在IDEA的调试时下断…

【蓝桥杯日记】复盘篇三——循环结构

前言 本篇内容是对循环结构进行复盘的,循环可谓是在基础阶段特别重要的东西,是三大结构(顺序结构、选择结构、循环结构)中最重要的结构之一。 目录 🍑1.找最小值 分析: 知识点: 代码如下 &…

【C/Python】Gtk部件ListStore的使用

一、C语言 在GTK中,Gtk.ListStore是一个实现了Gtk.TreeModel接口的存储模型,用于在如Gtk.TreeView这样的控件中存储数据。以下是一个简单的使用Gtk.ListStore的C语言示例,该示例创建了一个列表,并在图形界面中显示: …

PostGIS教程学习二十二:使用触发器追踪历史编辑操作

PostGIS教程学习二十二:使用触发器追踪历史编辑操作 生产环境下数据库的一个常见要求是能够跟踪用户编辑数据的历史:数据在两个日期之间是如何变化的,是谁操作的,以及它们哪些内容变化了?一些GIS系统通过在客户端接口…

单片机学习笔记--- 定时器/计数器(简述版!)

目录 定时器的介绍 定时计数器的定时原理 定时计数器的内部结构 两种控制寄存器 (1)工作方式寄存器TMOD (2)控制寄存器TCON 定时计数器的工作方式 方式0 方式1 方式2 方式3 定时器的配置步骤 第一步,对…

go语言socket编程

1.互联网分层模型 过程分析: 2.Socket图解 Socket是应用层与TCP/IP协议族通信的中间软件抽象层。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket后面,对用户来说只需要调用Socket规定的相关函数&a…

【笔记】React-Native跟Android交互--简单示例

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程:https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

【Oracle云】使用 boto3 访问 OCI 对象存储 (AWS S3协议兼容)

在现代云计算环境中,S3(Simple Storage Service)协议已经成为云对象存储的事实标准。它提供了简单、可扩展、高度耐用的存储解决方案,得到了广泛应用。Oracle Cloud Infrastructure(OCI)秉承着开放性和灵活…

ArcGIS Pro字段编号相关代码

字段属于SHP文件的重要组成部分,在某些时候需要对字段进行编号,这里为大家介绍一下字段编号相关的代码,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数据,除了POI数据,常见的GIS数据都可…

zookeeper(2) 服务器动态上下线监听和分布式锁案例

案例一:服务器动态上下线监听 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知 到主节点服务器的上下线。 1.服务端代码 package com.atguigu.case1;import org.apache.zookeeper.*;import java.io…