C# try-catch异常处理的用法

      try-catch 是一种在编程语言中用于捕获和处理异常的结构。它的作用是在可能引发异常的代码块中进行异常处理,以避免程序崩溃或产生不可预料的结果。
      当在 try 块中的代码执行时,如果发生了异常,程序会立即跳转到对应的 catch 块。catch 块用于捕获并处理特定类型的异常。
      在 catch 块中,可以根据异常的类型编写相应的处理逻辑。处理逻辑可以包括记录日志、显示错误信息、回滚事务等操作,以便更好地控制和处理异常情况。
      使用 try-catch 结构可以增加程序的健壮性和可靠性,能够更好地控制和处理异常情况,避免程序直接崩溃或产生不可预料的结果。它是常见的错误处理机制,在编程中被广泛应用。
在这里插入图片描述

目录

  • 1. 异常处理的概念和原理
  • 2. 抛出异常
  • 3. 捕获和处理异常:try-catch
    • 3.1 try 块
    • 3.2 catch 块
      • 3.2.1 捕获特定类型的异常
      • 3.2.2 捕获公共基类类型的异常
    • 3.3 finally 块
  • 4. 常见异常类型
  • 5. 处理多个异常
  • 6. 自定义异常
  • 7. 异常信息传递和堆栈跟踪
  • 8. 最佳实践
  • 9. 总结

1. 异常处理的概念和原理

异常是指在程序运行过程中出现的问题或错误。C# 提供了异常处理机制来捕获和处理这些异常,以保持程序的正常运行。异常处理的原理包括以下几个步骤:

  • 抛出异常:使用 throw 语句抛出一个异常,中断当前代码的执行,并将控制权转交给异常处理代码。
  • 捕获异常:使用 try-catch 语句来捕获可能抛出的异常。一旦发生异常,跳转到 catch 块中进行处理。
  • 异常处理:在 catch 块中编写处理异常的逻辑。根据具体的异常类型进行特定的处理,如记录日志、显示错误信息等。
  • 处理完毕:如果没有抛出异常或处理完所有异常,程序继续执行 catch 块之后的代码。无法处理的异常会导致程序终止。

2. 抛出异常

在 C# 中,可以使用 throw 语句抛出异常。格式如下:

throw new Exception("异常信息");

示例:

throw new ArgumentException("参数不能为空");

3. 捕获和处理异常:try-catch

使用 try-catch 语句捕获和处理异常。try-catch 语句由三个部分组成:try 块、catch 块和(可选的)finally 块。
在这里插入图片描述

3.1 try 块

try 块用于包含可能引发异常的代码。如果 try 块中发生了异常,程序将跳转到对应的 catch 块。

示例:

try
{
    // 可能抛出异常的代码
}

3.2 catch 块

catch 块用于捕获和处理指定类型的异常。可以有多个 catch 块,用于捕获不同类型的异常,并提供相应的处理逻辑。

3.2.1 捕获特定类型的异常

catch 块中指定异常类型,以便捕获该类型的异常并进行处理。

示例:

try
{
    // 可能抛出异常的代码
}
catch (DivideByZeroException ex)
{
    // 处理 DivideByZeroException 类型的异常
}
3.2.2 捕获公共基类类型的异常

catch 块中使用基类类型,可以捕获该基类及其派生类的异常。

示例:

try
{
    // 可能抛出异常的代码
}
catch (Exception ex)
{
    // 处理所有异常(包括派生类异常)的通用异常处理逻辑
}

3.3 finally 块

finally 块是一个可选的块,用于包含无论是否发生异常都需要执行的代码。通常用于资源的释放,无论发生异常与否,都保证该块里的代码会被执行。

示例:

try
{
    // 可能抛出异常的代码
}
catch (Exception ex)
{
    // 处理异常
}
finally
{
    // 在此处执行清理操作,无论是否发生异常
}

4. 常见异常类型

在 C# 中有很多常见的异常类型,它们继承自 System.Exception 类。以下是几个常见的异常类型:

  • DivideByZeroException:除以零异常
  • ArgumentNullException:空引用异常
  • ArgumentException:参数异常
  • FileNotFoundException:文件未找到异常
  • IOException:输入输出异常

5. 处理多个异常

通过使用多个 catch 块,可以捕获和处理多种类型的异常。

示例:

try
{
    // 可能抛出异常的代码
}
catch (DivideByZeroException ex)
{
    // 处理 DivideByZeroException 类型的异常
}
catch (ArgumentNullException ex)
{
    // 处理 ArgumentNullException 类型的异常
}
catch (Exception ex)
{
    // 处理其他类型的异常
}

6. 自定义异常

除了使用已有的异常类型,还可以自定义异常类型,以便更好地适应特定的业务需求。

自定义异常类要求继承自 System.Exception 类或其子类,并且应有一个公共的构造函数。

示例:

public class CustomException : Exception
{
    public CustomException(string message) : base(message)
    {
        // 构造函数逻辑
    }
}

// 抛出自定义异常
throw new CustomException("自定义异常信息");

7. 异常信息传递和堆栈跟踪

当异常被抛出时,它通常会携带一些关于异常的相关信息,如异常消息和堆栈跟踪信息。

  • 异常消息:描述异常的文本信息,通常包含错误原因。
  • 堆栈跟踪:显示了异常发生的调用链,从引发异常的方法开始,依次向上追溯到最终的异常处理器。

catch 块中,可以通过访问异常对象的属性来获取相关信息,并在处理异常时使用这些信息。

示例:

try
{
    // 可能抛出异常的代码
}
catch (Exception ex)
{
    string errorMessage = ex.Message; // 获取异常消息
    string stackTrace = ex.StackTrace; // 获取堆栈跟踪信息

    // 处理异常并记录日志等
}

8. 最佳实践

在进行异常处理时,以下是一些最佳实践的建议:

  • 不要过度依赖异常处理,尽量通过条件判断避免引发异常。
  • 捕获精确的异常类型以便更好地理解和处理特定的异常情况。
  • 记录和报告异常信息,使用日志库记录异常,向用户显示有意义的错误提示。
  • 避免捕获过宽的异常,尽量使用特定的异常类型进行捕获。
  • finally 块中执行清理操作,确保需要显式释放的资源得到正确释放。

9. 总结

异常处理是 C# 中重要的技术之一。通过 throw 抛出异常、try-catch 捕获和处理异常,我们能够改善程序的稳定性和可靠性。合理的异常处理将提高代码的容错性和用户体验。

参考资料:

  • Microsoft Docs - 异常处理: https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/exceptions/
  • C# Exception Handling Best Practices: https://exceptionnotfound.net/csharp-exception-handling-best-practices/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

http客户端Feign

http客户端Feign 文章目录 http客户端Feign定义和使用Feign客户端自定义Feign的配置Feign的性能优化feign的最佳实践 定义和使用Feign客户端 <!-- feign客户端依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>s…

为什么C语言没有被C++所取代呢?

今日话题&#xff0c;为什么C语言没有被C所取代呢&#xff1f;虽然C是一个功能更强大的语言&#xff0c;但C语言在嵌入式领域仍然广泛使用&#xff0c;因为它更轻量级、更具可移植性&#xff0c;并且更适合在资源受限的环境中工作。这就是为什么C语言没有被C所取代的原因。如果…

玩转 Scrapy 框架 (一):Scrapy 框架介绍及使用入门

目录 一、Scrapy 框架介绍二、Scrapy 入门 一、Scrapy 框架介绍 简介&#xff1a; Scrapy 是一个基于 Python 开发的爬虫框架&#xff0c;可以说它是当前 Python 爬虫生态中最流行的爬虫框架&#xff0c;该框架提供了非常多爬虫的相关组件&#xff0c;架构清晰&#xff0c;可扩…

高速视频采集卡设计方案:620-基于PCIe的高速视频采集卡

一、产品概述 基于PCIe的高速视频采集卡&#xff0c;通过PCIe3.0X8传输到存储计算服务器&#xff0c;实现信号的分析、存储。 北京太速科技 产品固化FPGA逻辑&#xff0c;适配视频连续采集&#xff0c;缓存容量2GB&#xff0c;开源的PCIe QT客户端软件&#xff0c…

常用网络接口自动化测试框架

(一&#xff09;GUI界面测试工具&#xff1a;jmeter 1、添加线程组 2、添加http请求 3、为线程组添加察看结果树 4、写入接口参数并运行 5、在查看结果树窗口查看结果 6、多组数据可增加CSVDataSetConfig(添加.csv格式的文件&#xff0c;并在参数值里以${x}格式写入) 此时变量…

第五讲观测值中与卫星、接收机有关的误差 第六讲观测值中与信号传播路径有关的误差以及电离层、对流层相关模型 | GNSS(RTK)课程学习笔记day3

说明&#xff1a;以下笔记来自计算机视觉life吴桐老师课程&#xff1a;从零掌握GNSS、RTK定位[链接]&#xff0c;从零掌握RTKLIB[链接]。非原创&#xff01;且笔记仅供自身与大家学习使用&#xff0c;无利益目的。 第五讲 观测值中与卫星、接收机有关的误差 卫星轨道误差 由卫…

如何有效压缩图片大小?保持质量的同时减小文件大小

图片体积过大&#xff0c;不仅仅会导致我们电脑或者手机内存不足&#xff0c;在一些网络平台上传的时候&#xff0c;也会因为限制上传失败&#xff0c;为了有效减少文件所占用的存储空间和上传&#xff0c;我们可以先利用图片压缩功能去把图片缩小kb&#xff0c;那么具体是怎么…

Python Pandas 多重索引DataFrame数据(第19讲)

Python Pandas 多重索引DataFrame数据(第19讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

【powershell】Windows环境powershell 运维之历史文件压缩清理

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

Find My资讯|苹果Find My大升级:可添加物品数量翻倍,从16个飙升至32个!

苹果Find My是Find My iPhone&#xff08;查找我的iPhone&#xff09;和Find My Friends&#xff08;查找朋友&#xff09;的结合体&#xff0c;新系统中苹果为了追求简洁&#xff0c;于是把这两个应用整合到一块了。Find My作用于iOS13、iPadOS&#xff08;苹果为iPad定制的新…

笨爸爸工房携手洛阳科学技术馆,开启全新手工课程!

笨爸爸工房与洛阳科学技术馆达成合作&#xff0c;每周六上午9点50分在洛阳科学技术馆开设全新的手工课程。通过丰富多彩的手工课程&#xff0c;让孩子在动手实践中感受传统木艺的乐趣&#xff0c;了解中国传统文化的内涵。笨爸爸工房以木工为媒介&#xff0c;希望通过提升父亲参…

LeetCode 739每日温度 496 下一个更大元素 | 代码随想录25期训练营day58

单调栈1 LeetCode 739 每日温度 2023.12.21 题目链接代码随想录讲解[链接] vector<int> dailyTemperatures(vector<int>& temperatures) {//暴力求解&#xff0c;但会超时/*vector<int> answer(temperatures.size(), 0);for (int i 0; i < tempe…

BWS2000倾角传感器c++测试代码【2】

问题一&#xff1a;串口频率的初始化 由于本次项目之中使用的线长为40米的倾角传感器&#xff0c;需要对于其频率输出存在要求&#xff0c;如何测试其频率如下所示&#xff1a; 如上所示相应的软件&#xff0c;软件中存在一句如果设置后不保存&#xff0c;则存在传感器断电后设…

开源堡垒机JumpServer结合内网穿透实现远程访问

开源堡垒机JumpServer结合内网穿透实现远程访问 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 …

python使用Tesseract

python使用Tesseract 一、介绍二、安装Tesseract三、使用Tesseract3.1 简单例子 一、介绍 Tesseract是一个开源的ocr工具&#xff0c;它是由C编写的&#xff0c;可以直接在Windows上运行&#xff0c;也可以用各种编程语言调用。 二、安装Tesseract Tesseract支持多个平台&am…

C#中var、object和dynamic的区别

在C#编程语言中&#xff0c;我们经常会遇到var、object和dynamic这三个关键字。它们都用于声明变量&#xff0c;但在使用方法和特性上存在一些重要的区别。本文将详细介绍这三者的差异。 目录 var关键字object关键字dynamic关键字总结 var关键字 var是C#语言中的隐式类型推断…

CentOS 7 Tomcat服务的安装

前提 安装ava https://blog.csdn.net/qq_36940806/article/details/134945175?spm1001.2014.3001.5501 1. 下载 wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.84/bin/apache-tomcat-9.0.84.tar.gzps: 可选择自己需要的版本下载安装https://mirr…

使用Python爬取GooglePlay并从复杂的自定义数据结构中实现解析

文章目录 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》&#xff0c;对分布…

Hbase的安装配置

注&#xff1a;本文默认已经完成hadoop的下载以及环境配置 1.上传zookeeper和hbase压缩包到指令路径并且解压 (理论上讲&#xff0c;hbase其实内置了zookeeper&#xff0c;我们也可以不另外下载&#xff0c;另外下载的目的在于减少组件间依赖性) cd /home mkir hbase cd /hom…

本地MinIO存储服务如何创建Buckets并实现公网访问上传文件

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统&#xff0c;它可以100%的运行在标准硬件上&#xff0c;即X86等…