我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#处理异常的方式有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#处理异常的方式有哪些

本篇内容主要讲解“C#处理异常的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#处理异常的方式有哪些”吧!

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

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

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

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

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

Exception类分析

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

这里写图片描述

  • 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是获取运行时资源字符串。返回的字符串是产生异常原因的错误消息或者空字符串。

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

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

public static string StackTrace{    [SecuritySafeCritical]    get    {        new EnvironmentPermission(PermissionState.Unrestricted).Demand();        return GetStackTrace(null, true);    }}
  • Source属性:包含生成异常的应用程序或对象的名称

  • TargetSite属性:引发当前异常的方法

  • 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#处理异常的方式有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#处理异常的方式有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#处理异常的方式有哪些

本篇内容主要讲解“C#处理异常的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#处理异常的方式有哪些”吧!关于异常,从我们一开始写代码的时候就开始伴随着我们,只不过那时还没入门,脑子
2023-06-22

c++异常处理的方法有哪些

在C++中,有以下几种异常处理的方法:1. try-catch语句块:使用try-catch语句块可以捕获和处理异常。在try块中编写可能会引发异常的代码,然后在catch块中捕获并处理这些异常。可以使用多个catch块来处理不同类型的异常
2023-10-10

Java异常的处理方式有哪些

这篇文章主要介绍“Java异常的处理方式有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java异常的处理方式有哪些”文章能帮助大家解决问题。什么是异常?异常在我们写代码是特别常见,因为程序员大
2023-06-30

RxJava处理业务异常的方式有哪些

这篇文章主要为大家展示了“RxJava处理业务异常的方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“RxJava处理业务异常的方式有哪些”这篇文章吧。关于异常Java的异常可以分为两种:
2023-05-30

C++中异常传递的方式有哪些

这篇文章给大家介绍C++中异常传递的方式有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++异常传递之1.传值(by value)传值的过程中会产生临时对象的拷贝,不能解决多态的问题,如下:myexception
2023-06-17

spring处理异常的方法有哪些

Spring提供了多种处理异常的方法,包括:1. 使用@ControllerAdvice注解的类:可以全局捕获和处理Controller层抛出的异常,可以在该类中定义多个@ExceptionHandler方法来处理不同类型的异常。2. 使用
2023-08-18

java异常处理的方法有哪些

Java中常见的异常处理方法有以下几种:1. try-catch语句:使用try块包裹可能抛出异常的代码,然后使用catch块捕获并处理异常。catch块可以根据不同的异常类型进行不同的处理。```javatry {// 可能抛出异常的代码
2023-09-27

golang异常处理的方法有哪些

在Go语言中,异常处理的方法有以下几种:1. 使用`if`语句进行错误检查:在函数调用后,使用`if`语句来检查返回值是否为错误。例如:```goresult, err := someFunction()if err != nil {//
2023-09-27

redis异常处理方法有哪些

在Redis中,可以通过以下几种方式处理异常:1. 异常捕获:在Redis操作过程中,可以使用try-catch语句来捕获异常,并在catch块中处理异常情况。2. 返回错误信息:Redis的操作会返回相应的错误信息,可以通过检查返回结果来
2023-09-16

C++ 函数异常处理的优点有哪些?

c++++ 函数异常处理的优点包括:代码清晰可读,将错误处理逻辑从常规代码中分离。提高程序健壮性,通过捕获和处理异常防止程序崩溃。改进错误消息,异常携带详细错误信息有助于调试和识别错误根源。扩展性强,允许在运行时处理错误,便于动态添加或修改
C++ 函数异常处理的优点有哪些?
2024-04-15

C++ 函数异常处理的缺点有哪些?

缺点:性能开销:额外的内存和时间开销,用于保留异常对象和进行堆栈回溯。程序流程复杂: 引入新的程序流程控制机制,增加代码复杂性和理解难度。潜在的资源泄漏:异常可能导致资源泄漏,因为析构函数可能无法调用。破坏对象语义:异常可能破坏对象的语义,
C++ 函数异常处理的缺点有哪些?
2024-04-15

C++ 技术中的异常处理:不同类型的异常处理机制有哪些?

c++++中异常处理机制有:1. try-catch 块:捕获和处理异常;2. noexcept 规范符:指定函数是否可能抛出异常;3. 运算符重载:重载运算符抛出异常。实战中,try-catch块可处理文件操作中的异常,如文件打开失败和内
C++ 技术中的异常处理:不同类型的异常处理机制有哪些?
2024-05-10

java超时异常处理的方法有哪些

Java中超时异常处理的方法有以下几种:使用线程的interrupt()方法:在执行任务的线程中设置一个定时器,当任务执行时间超过预设的时间时,调用线程的interrupt()方法中断任务的执行。任务中需要通过判断线程的中断状态来提前结束任
2023-10-26

C++ 函数异常处理中常见陷阱有哪些?

c++++ 函数异常处理中常见的陷阱:避免在异常处理块中返回局部变量引用或指针,以免指向无效内存。异常处理块中不要重复抛出异常,以免覆盖原始异常信息。谨慎使用 noexcept 指定符,确保函数确实不会抛出异常。使用智能指针和异常规范,以提
C++ 函数异常处理中常见陷阱有哪些?
2024-04-24

C++ 技术中的异常处理:异常处理对程序性能的影响有哪些?

异常处理对 c++++ 程序性能的影响包括:异常抛出和捕获会导致堆栈操作和额外的代码路径。动态内存分配可能导致内存碎片化。优化技巧包括避免过度异常、优化异常处理程序、使用 noexcept 规范和异常规范。C++ 技术中的异常处理:异常处理
C++ 技术中的异常处理:异常处理对程序性能的影响有哪些?
2024-05-09

java抛出异常的方式有哪些

在Java中,可以通过以下方式抛出异常:1. 使用throw语句手动抛出异常。可以使用throw关键字将一个异常对象抛出,例如:```javathrow new Exception("发生异常");```2. 使用throws关键字在方法签
2023-09-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录