首页 > 编程语言 >每个.NET开发都应掌握的C#异常处理知识点

每个.NET开发都应掌握的C#异常处理知识点

时间:2023-09-20 12:47:17浏览次数:54  
标签:知识点 Exception C# 处理 NET 异常

上篇文章讲述了C#集合知识点,本文将介绍C#异常处理知识点。异常处理是.NET开发中至关重要的一部分,它允许开发者在程序出现错误或不正常情况时采取适当的措施,从而提高应用程序的稳定性和可靠性。本文将介绍C#异常处理知识点,异常的基本概念略过,请查看官网。

1、自定义异常

开发者可以创建自定义异常类,以便更好地处理特定于应用程序的错误情况。自定义异常类通常继承自 System.Exception,并可以自定义信息或属性来描述异常情况。案例可以查看本公众号之前的文章,如下:

详解-->C#自定义异常就这么简单

2、捕获不同类型的异常

使用多个 catch块可以捕获和处理不同类型的异常。这使开发者能够根据异常类型采取不同的处理措施,以更精确的找到异常的类型并快速的解决问题。案例如下:

try
{
    // 可能引发异常的代码
}
catch (ArgumentNullException ex)
{
    // 处理特定类型的异常
}
catch (IOException ex)
{
    // 处理另一种IO类型的异常
}
catch (SfException ex)
{
    // 处理自定义异常代码
}
catch (Exception ex)
{
    // 处理其他所有异常的通用代码
}

3、异常过滤器

在C#6及更高版本支持异常过滤器,允许在 catch块内使用 when子句来进一步筛选捕获的异常。这样可以根据异常的属性或条件来选择性地处理异常。案例如下

try
{
    // 可能引发异常的代码
}
catch (Exception ex) when (ex is MyException || ex is InvalidOperationException)
{
    // 仅处理特定类型的异常
}
//其中Exception是自定义异常

4、抛出异常的特殊方式

可以使用throw关键字可以在代码中明确引发异常。这在开发自定义异常、或在特定条件下引发异常时非常有用。

if (someCondition)
{
    throw new MyException("这是个自定义异常。");
     throw new Exception("这是个系统异常。");
}

4、 全局异常处理

在应用程序中可以设置全局异常处理程序来捕获未处理的异常并记录或者发送消息给开发者,以便及时修复问题。这对于监视和维护生产环境中的应用程序非常重要。可以把异常放到程序的入口,便于检测全局。案例如下:

   static void Main()
        {
            // 在应用程序的入口点设置全局异常处理程序
            AppDomain.CurrentDomain.UnhandledException += GlobalExceptionHandler;

            // 模拟一个可能引发异常的操作
            int result = Divide(10, 0);

            Console.WriteLine("输出: " + result); // 这行代码不会被执行

            // 其他应用程序逻辑
            Console.WriteLine("应用继续运行!");
        }

        static int Divide(int x, int y)
        {
            return x / y;
        }

        static void GlobalExceptionHandler(object sender, UnhandledExceptionEventArgs e)
        {
            // 这个方法会在未处理异常发生时被调用
            Exception ex = (Exception)e.ExceptionObject;
            Console.WriteLine("Unhandled Exception: " + ex.Message);

            // 在此可以进行异常处理,例如记录错误日志、通知开发人员、尝试恢复应用程序等

            // 通常,全局异常处理后会终止应用程序
        }

5、异常类层次结构

.NET中的异常都是从 System.Exception类派生的。这个异常类层次结构有助于区分不同类型的异常,并采取相应的处理措施。常见的异常类型包括:

System.NullReferenceException:当尝试访问空对象引用时引发。

System.ArgumentException:当方法的参数无效时引发。

System.IO.IOException:用于处理文件和输入/输出操作的异常。

6、异常处理规范

异常处理提供了必要的结构,但若使用不当可能带来很多问题。以下是异常处理的一些规范,仅供参考。

1)只捕捉可处理的异常:仅捕获已知如何处理的异常,避免不必要的捕获。其他异常应留给更高级别的调用者。

2)不要隐藏(bury)无法完全处理的异常:不要假装异常没有发生,除非明确有处理方式。应该重新抛出异常,以便更高级别的代码能够处理。

3)尽量减少使用 System.Exception 和一般 catch 块:虽然几乎所有异常都是从 System.Exception 派生的,但某些异常最佳处理方式是不处理它们,或者尽快关闭应用程序。

4)避免在调用栈较低的位置报告异常:将异常报告和记录放在调用栈较高的位置,以便更容易追踪和诊断问题。

5)想好异常条件来避免在catch块中重新抛出异常:如果发现会捕捉到不能恰当处理、所以需要重新抛出的异常,那么最好优化异常条件,从一开始就避免捕捉。

6)避免在异常条件表达式中抛出异常:如提供了异常条件表达式,要避免在表达式中抛出异常,否则会造成条件变成false,新异常被忽略。因此,可考虑在一个单独的方法中执行复杂的条件检查,用try/catch块包装该方法调用来显式处理异常。

7)避免以后可能变化的异常条件表达式:如异常条件可能因本地化等情况而改变,预期的异常条件将不被捕捉,进而改变业务逻辑。因此,要确保异常条件不会因时间而改变。

结语

本文讲述了C#异常处理的知识点,这些是.NET开发中处理异常不可或缺的技能之一。通过正确处理异常,开发者可以提高应用程序的可靠性、稳定性和可维护性,更容易诊断和修复问题。

希望本文提供的C#异常处理知识对每个.NET开发者都有所帮助,对于C#异常处理的知识点,你还知道哪些?欢迎留言讨论或者吐槽本文。

参考:

1、微软官方文档 :

learn.microsoft.com/zh-cn/dotnet/standard/exceptions/

2、图书《C# 7.0本质论》

3、chatgpt

推荐阅读

1、每个.NET开发都应掌握C#泛型的几个知识点

2、每个.NET开发都应掌握的linq知识点

3、每个.NET开发都应掌握的C#接口知识点

4、每个.NET开发都应掌握的C#委托事件知识点

5、每个.NET开发都应掌握的C#集合知识点

来源公众号:DotNet开发跳槽    

标签:知识点,Exception,C#,处理,NET,异常
From: https://www.cnblogs.com/xbhp/p/17717019.html

相关文章

  • c++中生成随机数
    #include<iostream>#include<string>#include<algorithm>#include<ctime>usingnamespacestd;constintINF=1e9;intmain(){//设置种子srand((unsigned)time(NULL));//可随机生成0-10以内的数 intt=rand()%10; cout<<......
  • 谈一谈 IPA 上传到 App Store Connect 的几种方法
    1、前言关于上传ipa包到AppStoreConnect的方法,相信有iOS开发经验的同学,一定知道完成App开发后,一般都是用Xcode的Archive打包后上传到苹果后台。所以,这个就是今天要写的水文?显示不是吧!答案肯定不是啊,本文将给大家一个相对全面介绍。苹果开发的知识点非常多,官方文档也......
  • 【结对编程互评-C++】中小学数学卷子自动生成程序
    【结对编程互评-C++】中小学数学卷子自动生成程序项目名称:中小学数学卷子自动生成程序编程语言:C++代码作者:李义评价人:张恒硕目录[1.项目要求][1.1目标用户][1.2实现功能][2.代码分析][3.功能测试][3.1登录功能测试][3.2出题功能测试][4.优缺点分析与总结]......
  • 用css控制td强制换行
    即便是给td限定的宽度,但是如果里面的内容是连续的,IE就认为是一个单词,不会换行。控制td换行的css样式:style="word-wrap:break-word;word-break:break-all;"<tablewidth="100%"border="0"cellspacing="1"cellpadding="0"><tr><tdwi......
  • JS实现table动态生成过程中,移动行checkbox值丢失问题的解决
     最近在做项目过程中遇到这样一个疑问:(查看实例代码TEST1)DHTML中table对象的moveRow方法实现对table中表格行移动到新位置。例子TEST1中行2包含文本框、复选框、下拉框,当分别键入值后对行2执行上移操作后,我们发现,文本框与下拉框的值不会丢失,但复选框值会丢失。而如果在行2中键......
  • ORACLE日期时间函数大全
    ORACLE日期时间函数大全  TO_DATE格式(以时间:2007-11-02  13:45:25为例)         Year:            yytwodigits两位年               显示值:07       yyythreedigits三位年               显示值......
  • hadoop中mapred.tasktracker.map.tasks.maximum的设置
    目前,我们邮件的一部分log已经迁移到Hadoop集群上并由Hive来执行相关的查询hadoop中默认的mapred.tasktracker.map.tasks.maximum设置是2也即:每一个tasktracker同时运行的map任务数为2照此默认设置,查询80天某用户的操作日志,耗时5mins,45sec经过测试,发现将mapred.tasktracker.map.ta......
  • 实现mapreduce多文件自定义输出
     普通maprduce中通常是有map和reduce两个阶段,在不做设置的情况下,计算结果会以part-000*输出成多个文件,并且输出的文件数量和reduce数量一样,文件内容格式也不能随心所欲。这样不利于后续结果处理。如果只是想做到输出结果的文件名可控,实现自己的LogNameMultipleTextOutputFormat类,......
  • HBase HFile与Prefix Compression内部实现全解--KeyValue格式
    1.引子 HFile(HBaseFile)是HBase使用的一种文件存储格式的抽象, 目前存在两种版本的HFile:HFileV1和HFileV2 HBase0.92之前的版本仅支持HFileV1,HBase0.92/0.94同时支持HFileV1和HFileV2。 以下分别是HFileV1/V2的结构图: HFileV1HFileV2(注:这两个图片在hbase......
  • C++学习
    C++简单或复杂又如何,万般皆由人--风尘尘风一、C++简述1.1C++概念C++是一种由BjarneStroustrup于1979年在新泽西州贝尔实验室开始设计开发的高级语言C++扩充和完善了C语言,是面向对象的程序设计语言,C++可运行于多种平台上(Win、Mac、unix)1.2C++特点C++......