返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >总结C#处理异常的方式
  • 302
分享到

总结C#处理异常的方式

2024-04-02 19:04:59 302人浏览 八月长安
摘要

关于异常,从我们一开始写代码的时候就开始伴随着我们,只不过那时还没入门,脑子里并没有产生意识这就是异常。 异常:程序运行期间发生错误, 异常对象: 将程序发生的各种错误封装成对象

关于异常,从我们一开始写代码的时候就开始伴随着我们,只不过那时还没入门,脑子里并没有产生意识这就是异常。

异常:程序运行期间发生错误,

异常对象: 将程序发生的各种错误封装成对象

曾记得第一次面试的时候,面试官问了我这样的一个拐弯的问题“你平时是怎么解决出现的各种问题”,a:当时心中一惊,看别人的面经也提到了这个问题,没有多想“首先自己找找看哪里出了出的错误,定位到出现错误的位置,看出现了什么异常”。q:那你说说有哪些异常,,产生异常的原因,如何处理的。a:空指针,超出索引异常,en en………当时挺尴尬,问到了异常我却回答这么简单,缺乏思考。

在实际的工作中,捕获异常,收集分析异常对于解决问题至关重要。

Exception类分析

SystemException类继承Exception,前者是System命名空间中所有其他异常类的基类,在捕获异常的时候,我首先查看的就是Exception对象信息。Exception重要成员如下图

这里写图片描述

  • 1.Message属性:产生异常原因的错误消息

[__DynamicallyInvokable]
public virtual string Message
{
    [__DynamicallyInvokable]
    get
    {
        if (this._message != null)
        {
            return this._message;
        }
        if (this._className == null)
        {
            this._className = this.GetClassName();
        }
        return Environment.GetRuntimeResourceString("Exception_WasThrown", new object[] { this._className });
    }
}

Message属性是只读属性,GetRuntimeResourceString是获取运行时资源字符串。返回的字符串是产生异常原因的错误消息或者空字符串。

  • 2.Data:的其他异常信息的键/值对的集合

public virtual IDictionary Data {  
            get {
                if (_data == null) 
                  if(IsImmutableAgileException(this))                            _data = new EmptyReadOnlyDictionaryInternal();
                  else
         _data = new ListDictionaryInternal(); 
                return _data; 
            } 
        }
  • 3.StackTrace:出现异常之前调用的方法名称和签名

public static string StackTrace
{
    [SecuritySafeCritical]
    get
    {
        new EnvironmentPermission(PermissionState.Unrestricted).Demand();
        return GetStackTrace(null, true);
    }
}
  • 4.Source属性:包含生成异常的应用程序或对象的名称
  • 5.TargetSite属性:引发当前异常的方法
  • 6.GetBaseException方法 :返回System.Exception,它是所有异常类的“基”类。

常见的异常类

异常类型有很多,他们都是继承自SystemException,这些异常类型大概分为以下这几种1.与数组集合有关2.与成员访问有关3.与参数有关4.与算术相关5.IO相关6.当然还有其他的一些异常。

1.与数组集合有关

  • IndexOutOfRangeException类:索引超出范围引发的异常
  • ArrayTypeMismatchException类:数组集合存储数据类型不正确引发的异常
  • RankException类:处理维数错误引发的异常

2.IO有关的异常

与IO相关的异常都继承自IOException类,该类用于处理进行文件输入输出操作时所引发的异常,IOException类的5个直接派生类如下。

  • DirectoryNotFoundException类:没有找到指定的目录而引发的异常。
  • FileNotFoundException类:没有找到文件而引发的异常。
  • EndOfStreamException类:处理已经到达流的末尾而还要继续读数据而引发的异常。
  • FileLoadException类:无法加载文件而引发的异常。
  • PathTooLongException类:文件名太长而引发的异常。

3.成员访问有关的异常

与成员访问相关的异常都继承自MemberAccessException这个类,它继承自SystemException。

  • FileAccessException:访问字段成员失败所引发的异常
  • MethodAccessException:访问方法成员失败引发异常
  • MissingMemberException:成员不存在引发的异常

4.参数相关的异常

与参数有关的异常类ArgumentException都继承自SystemException,处理给方法成员传递参数时发生异常

  • ArgumentOutOfRangeException:当一个参数不在给定范围内引发的异常
  • ArgumentNullException:参数为null(不允许null)的情况下引发的异常

5.与算术相关

ArithmeticException异常类用于处理与算术相关的异常,它的相关子类如下

  • DivideByZeroException:整数十进制试图除以0引发的异常(被除数不能为0)
  • NotFiniteNumberException:浮点数运算中出现无穷大或非负值引发的异常

6.其他异常

  • NullReferenceException:当一个对象没有实例化时并引用引发的异常
  • InvalidOperationException:当对方法的调用对象当前状态无效时引发异常
  • InvalidCastException:处理类型转换期间引发的异常
  • OutOfMemoryException:处理内存不足引发的异常
  • StackOverflowException:处理栈溢出引发的错误

异常捕获

C#中提供try 和catch块提供了一种结构化的异常处理方案,所有可能出现的异常都必须得到妥善的处理,try catch本身并不会影响系统的性能,在没有发生异常的时候try catch 是不会影响系统性能的。受影响的时候是发生异常的时候。

关键字 try catch finally。先执行try里面的语句,如果抛出异常就会被catch捕获。无论出不出现异常都会执行finally里面的语句。另外不常用的throw关键字:当问题出现时,程序抛出一个异常。


class Program
    {
        static void Main(string[] args)
        {
            DivideNumber div = new DivideNumber();
            div.DivideMethod(2, 0);
            Console.ReadKey();
        }
    }
    class DivideNumber
    {
        int result;
        public DivideNumber()
        {
            result = 0;
        }
        public void DivideMethod(int a,int b)
        {
            try
            {
                result = a / b;
            }
            catch (DivideByZeroException e)
            {
                Console.WriteLine("exception,被除数不能为0,e.message:" + e.Message);
            }
            finally {
                Console.WriteLine($"{a}除以{b}的结果是"+result);
            }
        }
    }

异常处理原则和建议

在实际的开发中,异常到底需要怎么写,还是和系统的稳定性和容错性有一定要求的。

要捕获具体的异常

在捕获异常的时候,我们经常习惯性写catch(Exception ex) ,这个并非具体的异常,最好是能具体到ArgumentException、FORMatException等异常类,不要抛出”new Exception()”

catch中啥也不干,异常要向顶层抛出

这种情况在自己写demo的时候可能比较常见,在编写catch(Exception ex)这块代码下啥也不干,不要这样做。切记出现的异常要想顶层抛出

合理使用finally块

finally关键字是不管抛出什么类型异常都会被执行,大多数的时候能在finally块下执行的代码,也能写在catch里面。那么finally关键字到底在什么情况下使用比较合适呢,比如清理资源,关闭流,回复状态等。

抛出的异常要记录下来

当然程序中出现的异常并不是所有都要记录下来,有些异常还是记录下来便于分析具体的问题。一些记录日志库 log4net ,EIF……

不要只记录Exception.Message的值,还需要记录Exception.ToString()

刚刚前面的例子,我打印的e.Message ,仅仅只是输出“尝试除以0”,提示的错误信息不具体,并不推荐这样做。Tostring方法中包含了stacktrace、内部异常信息、Message……通常这些信息比仅一个Message更重要

不要将“抛出异常”作为函数执行结果的一种

“抛出异常”应该向顶层抛出,但是不能作为方法执行结果的一种,方法的结果不能是异常类。

每个线程要包含一个try/catch块

创建子线程去执行任务时,主线程不会知道子线程的异常情况,所以每个线程都需要一个try、catch.

来自“代码思考者“的评论

之前在做C#项目的项目经理时,我也思考过如何有效地在项目团队中实践异常的处理。

首先,异常处理应该是系统设计规约的一部分出现在系统设计文档中,而不仅仅是一种技术实现。

作为设计文档的一部分,异常处理应该着眼于系统容错性和稳定性(正如楼主提到的那样)。然后在根据这个规约,再来具体讨论和选择异常处理中使用的各种技术细则。

比如,在设计服务时,必须在服务的调用接口处有异常处理,否则客户端传过来的任何有害数据都可能让服务器挂掉。

比如,对异常的处理在系统的设计中,必须有明确说明,不能随便在哪个模块中处理异常。

以上是我的个人经验,还望走过的朋友多多交流。

到此这篇关于总结C#处理异常方式的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: 总结C#处理异常的方式

本文链接: https://lsjlt.com/news/160852.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 总结C#处理异常的方式
    关于异常,从我们一开始写代码的时候就开始伴随着我们,只不过那时还没入门,脑子里并没有产生意识这就是异常。 异常:程序运行期间发生错误, 异常对象: 将程序发生的各种错误封装成对象 ...
    99+
    2024-04-02
  • C#各种异常处理方式总结
    .NET的异常处理机制用来发现、处理运行时错误。如果开发人员没有提供异常的处理机制,就默认采用.NET的机制。 通常使用try...catch...finally捕获异常。 try ...
    99+
    2024-04-02
  • Java常见异常及处理方式总结
    目录一、概述二、异常分类三、声明及抛出四、捕获异常五、捕获多个异常六、自定义异常七、异常堆栈一、概述 异常指不期而至的各种状况,它在程序运行的过程中发生。作为开发者,我们都希望自己写...
    99+
    2024-04-02
  • C#实现异步的常用方式总结
    目录前言.NET异步编程模式C#异步有四种实现方式1、异步方法(Async Method TAP模式)2、任务并行库(TPL, Task Parallel Library&...
    99+
    2023-05-19
    C#实现异步方式 C#实现异步 C# 异步
  • python 异常处理总结
    最近,做个小项目经常会遇到Python 的异常,让人非常头疼,故对异常进行整理,避免下次遇到异常不知所措,以下就是对Python 异常进行的整理。 1.Python异常类 ...
    99+
    2022-06-04
    异常 python
  • Python异常及处理方法总结
    调试Python程序时,经常会报出一些异常,异常的原因一方面可能是写程序时由于疏忽或者考虑不全造成了错误,这时就需要根据异常Traceback到出错点,进行分析改正;另一方面,有些异常是不可避免的,但我们可以对异常进行捕获处理,防止程序终...
    99+
    2023-01-31
    异常 方法 Python
  • 常见的Python异常及处理方法总结
    目录一、错误与异常1.什么是错误2.什么是异常3.回溯信息二、常见异常常见异常类三.异常处理1.异常处理2.简单的异常处理格式3.执行顺序4.except分支可以有多个5.执行顺序6...
    99+
    2024-04-02
  • Python常见异常处理总结
    目录异常处理介绍语法报错异常处理解决方法抛出异常自定义异常其他内置函数总结异常处理介绍 在实际的开发中,我们经常遇到一些报错的例子,在pycharm的显示页面下,当我们看到一串串的红...
    99+
    2024-04-02
  • Java异常(Exception)处理以及常见异常总结
    目录前言异常简介 异常类型 总结前言 很多事件并非总是按照人们自己设计意愿顺利发展的,经常出现这样那样的异常情况。例如: 你计划周末郊游,计划从家里出发→到达目的→游泳→烧烤→回家。...
    99+
    2024-04-02
  • Python中异常捕获与处理的方法总结
    Python异常是在程序执行时发生的错误,可能会导致程序终止运行。 在Python中,异常处理是一种机制,它允许开发人员在程序发生异常时捕获、处理和报告这些异常,以便程序可以继续运行...
    99+
    2023-05-18
    Python异常捕获 Python异常处理 Python异常
  • C#处理异常的方式有哪些
    本篇内容主要讲解“C#处理异常的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#处理异常的方式有哪些”吧!关于异常,从我们一开始写代码的时候就开始伴随着我们,只不过那时还没入门,脑子...
    99+
    2023-06-22
  • Python基础异常处理梳理总结
    目录前言一、常见的Python异常AssertionError:断言语句(assert)失败AttributeError:尝试访问未知的对象属性IndexError:索引超出序列的范...
    99+
    2024-04-02
  • SpringBoot实现全局异常处理方法总结
    目录全局异常处理配置全局异常全局异常处理的升级加入自定义异常处理处理 Controller 数据绑定、数据校验的异常GlobalExceptionHandler全部代码总结在项目开发...
    99+
    2024-04-02
  • Redis缓存三大异常的处理方案梳理总结
    目录前言一、背景二、缓存雪崩(一)是什么(二)为什么(三)怎么办三、缓存击穿(一)是什么(二)为什么(三)怎么办四、缓存穿透(一)是什么(二)为什么(三)怎么办五、其他(一)缓存预热(二)缓存降级六、总结前言 Redis...
    99+
    2022-06-23
    Redis缓存异常处理方案 Redis缓存异常
  • Python的异常处理方式
    这篇文章主要介绍“Python的异常处理方式”,在日常操作中,相信很多人在Python的异常处理方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python的异常处理方式”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-04
  • PostgreSQL时间处理的一些常用方式总结
    目录1.获取当前时间2.date_part函数3.extract()函数4.日期格式化函数5.时间运算6.计算时间差总结1.获取当前时间 now()函数: select now(); current_time...
    99+
    2023-03-15
    pgsql时间处理 pg时间格式转换 pgsql时间相减
  • 全面总结Android中线程的异步处理方式
    一、概述 Handler 、 Looper 、Message 这三者都与Android异步消息处理线程相关的概念。那么什么叫异步消息处理线程呢? 异步消息处理线程启动后会进入一...
    99+
    2022-06-06
    异步 线程 Android
  • Java异常处理方法汇总
    目录一、异常是什么 二、异常类型 三、常见异常 四、常用异常方法 五、异常处理 六、关键字 throws/throw 七、自定义异常 前言: 我们在软件开发的过程中,任何语言的开发过...
    99+
    2024-04-02
  • Springboot处理异常的常见方式
    目录一、制造异常二、统一异常处理三、特殊异常处理四、自定义异常处理一、制造异常 报500错误。在大量的代码中很难找到错误 二、统一异常处理 添加异常处理方法 GlobalEx...
    99+
    2024-04-02
  • Java中的异常和处理知识点总结
    这篇文章主要介绍“Java中的异常和处理知识点总结”,在日常操作中,相信很多人在Java中的异常和处理知识点总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的异常和处理知识点总结”的疑惑有所帮助!...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作