C#基础知识整理:基础知识(13) 异常

    往往我们在写代码的时候,总会在运行中遇到某些问题而导致程序崩溃。这并不是编程人员的水平不行,而是由业务逻辑,操作系统,或者电脑等其它设备出现问题而造成,比如在c#中经常用到user32.dll里的一些方法,假如这个文件被删掉了,你的程序照样运行不了。当然作为一个有水平的程序员总会在写程序时是需要将各种情况都考虑进去的,水平越高考虑的情况就越多,而考虑的越多你的程序崩溃的机会就越少,健壮性就越好。
一般来说,程序运行不了会有两种情况:
    一是错误。它包括环境的错误(比如文件缺少,文件内容错误,导致与程序约定的不符合,系统版本不支持等等);内存操作错误(比如内存不足导致分配内存失败);程序逻辑错误(这一般是流程错误导致程序得出了错误的结果等);
    二是异常。异常是指程序由于当前流程的因素或意外行为导致无法运行。一般包括:
非法操作,用户输入了错误指令;输入输出异常,访问外部设备出现的非硬件性问题,比如读写硬盘时,结果将外部的虚拟光驱,软盘等也当成硬盘使用,或者程序本身没有问题,但是读写硬盘还是报出错误等;内存分配异常,内存不足时,导致无法创建新的对象。
    总的来说,错误和异常有一个关键的区别,错误是不允许出现的,一旦出现就必须要修改程序,更改运行环境;而异常是程序的一部分,不论什么程序或多或少都会遇到各类异常,异常出现程序就要处理异常,但是异常不应该影响程序继续运行。对于错误则是出现了就修改。下面看下c#中异常的处理。
    一般来说,为了保证程序不出错,都会做很多判断if…else,但是智者千虑必有一失,就算是大牛总不能让程序面面俱到、所有情况都能想到。那么这是我们就应该用到c#中的处理异常的方式。c#中采用的是抓抛模型来处理异常,当程序出现了异常后在处理异常的地方捕获到这个异常对象。抛出的是一个exception类或者其子类的对象,比如:
argumentexception: 参数不合法时抛出此异常。
argumentnullexception: 参数为null时抛出此异常。
argumentoutofrangeexception: 参数超出许可范围时抛出此异常。
捕获异常格式如下:

            try            {                //代码段            }            catch (Exception ex)            {                //处理异常            }            finally            {                //最后一定执行的            }

try代码块中是可能出现异常的代码,可以使用throw关键字抛出异常,也可以访问任何可能会抛出异常的属性或方法;
catch代码块用于捕获要捕获的异常,并包含处理该异常的代码;
finally代码块表示异常处理结束后执行的代码段,即finally中的代码段总是被最后执行,而无论是否捕获到了异常。
看看下面几段代码:
继承自Exception直观了解下Exeption类:

  public class MySelfException : Exception    {        ///         /// 默认构造器        ///         public MySelfException()            : base()        {        }        ///         /// 提供一个string类型的参数构造器,可设置自定义信息        ///         ///         public MySelfException(string message)            : base(message)        {        }        ///         /// 用于传入异常信息,另外可以传入该异常有哪个其它异常引发的        ///         ///         ///         public MySelfException(string message, Exception innerException)            : base(message, innerException)        {        }        ///         /// 覆盖Message属性,返回经过处理的异常信息        ///         public override string Message        {            get            {                return "有异常:" + base.Message;            }        }    }

下面看下抓抛的过程:

  public class Exceptions    {        public static void PersonInfo(string name, char sex, int age)        {            if (string.IsNullOrEmpty(name))            {                throw new ArgumentNullException("name");            }            if (sex != '男' && sex != '女')            {                throw new ArgumentException("sex只能为“男”或“女”");            }            if (age = 150)            {                throw new ArgumentOutOfRangeException("age");            }            Console.WriteLine(string.Format(@"name={0},sex={1},age={2}", name, sex, age));        }        public static void Throwable(bool canThrow, int num)        {            if (canThrow)            {                throw new MySelfException("测试异常");            }            Console.WriteLine(1 / num);            Console.WriteLine("木有抛出异常");        }    }

//调用:

   class Program    {        static void Main(string[] args)        {            try            {                // Exceptions.PersonInfo(null, '男', 22);                 // Exceptions.PersonInfo("Purple", '呵呵', 22);                Exceptions.PersonInfo("Purple", '男', 1000);                //Exceptions.PersonInfo("Purple", '男', 22);                Console.WriteLine("代码执行无错误");            }            catch (ArgumentNullException e)            {                Console.WriteLine(e.Message);                Console.WriteLine(e.StackTrace);            }            catch (ArgumentOutOfRangeException e)            {                Console.WriteLine(e.Message);                Console.WriteLine(e.StackTrace);            }            catch (ArgumentException e)            {                Console.WriteLine(e.Message);                Console.WriteLine(e.StackTrace);            }            Console.ReadLine();        }    }

    可以看到,在try代码块中,一旦程序运行到throw关键字,则立即停止运行其后的代码,随即跳转到对应throw抛出异常对象类型的catch代码块中执行。所以抓抛模型是一种更为直观和合理的异常处理方式。

以上就是C#基础知识整理:基础知识(13) 异常的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1432200.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 06:21:38
下一篇 2025年12月13日 17:57:33

相关推荐

  • C#基础知识整理:基础知识(14) 数组

    无论哪种语言,肯定会有集合的概念。而最简单,最直观的集合应该就是数组了,数组是在内存中连续的一段空间。看看c#中数组 的定义。1、int[] intArry ; intArry= new int[6]; 这里声明了一个int数组类型变量intArry,并保存一个具有6个单元的int数组对象; int…

    2025年12月17日
    000
  • C#基础知识整理 基础知识(18) 值类型的装箱和拆箱(一)

    仔细了解装箱和拆箱其实是很有趣的,首先来看为什么会装箱和拆箱呢?看下面一段代码: class Program { static void Main(string[] args) { ArrayList array = new ArrayList(); Point p;//分配一个 for (int …

    好文分享 2025年12月17日
    000
  • C#基础知识整理:C#类和结构(3)

    1、静态类和静态成员有哪些功能特性? 实现代码?    静态类和静态成员是指使用static关键字定义的类或成员,凡是static类的成员一定是static成员,不然会报错的。静态类和成员的一大特点就是它们是独一无二的。如果是static类,那么它是不能实例化的,而且加载在内存中只有一个;如果是st…

    2025年12月17日
    000
  • C#基础知识整理:C#类和结构(4)

    1、什么是接口? 功能特性? 实现代码?    接口就是使用interface关键字定义的,由类的成员的组合组成的,描述一些功能的一组规范。在c#中可以看到,系统的一些接口都是这样命名的:icomparable(类型的比较方法)、icloneable(支持克隆)、idisposable(释放资源)等…

    2025年12月17日
    000
  • C#基础知识整理:基础知识(1) Main方法

    千里之行始于足下,掌握某一项技能,都是要从最基本的东西开始。温故而知新,一件小事当你在不同的境遇,不同的时间下去做,总能获得意想不到的体验和收获。那么首先就从main方法开始吧, //using关键字在该处的作用是引入一个“外部程序集”,System是微软提供的.net平台最基本程序集,所有.net…

    好文分享 2025年12月17日
    000
  • C#基础知识整理:基础知识(2) 类

        类,是面向对象语言的基础。类的三大特性:封装、继承、多态。最基本的特性就是封装性。程序员用程序描述世界,将世界的所有事物都看成对象,怎么描述这个对象?那就是类了。也就是用类来封装对象。用书上的话说,类是具有相同属性和行为的对象的抽象。宝马汽车、别克汽车、五菱之光汽车… 基本具有相…

    2025年12月17日
    000
  • C#基础知识整理:基础知识(3) 类的构造

    我们定义了yschool,yteacher类,实例化对象时: YSchool shool1 = new YSchool(); shool1.ID = 1; shool1.Name = “清华附中”; YSchool school2 = new YSchool(); school2.ID = 2; s…

    好文分享 2025年12月17日
    000
  • C#基础知识整理:基础知识(4) 继承

        前面提到过,面向对象的三大特性:封装性、继承性和多态性。封装在前面类的定义里也了解的差不多透彻了,现在看看继承的特性。继承实际是一个类对另一个类的扩展,后者称之为基类,前者称之为子类。继承就是子类拥有基类的一切属性和方法,子类还可以增加属性和方法。但是子类不能去掉父类的属性和方法。    当…

    2025年12月17日
    000
  • C# 快速排序

    c# 快速排序 using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Sort{ class QuickSorter { private static int[] myA…

    2025年12月17日
    000
  • C# 归并排序

     c# 归并排序 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sort { class MergeSorter { /// /// 归并排序之归:归并排…

    2025年12月17日
    000
  • C# 插入排序

    c#  ,插入排序 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sort { class InsertSorter { public static in…

    2025年12月17日
    000
  • C# 堆排序

    c#  堆排序 using System; using System.Collections; namespace Sort { public class HeapSorter { public static int[] Sort(int[] sortArray) { BuildMaxHeap(so…

    好文分享 2025年12月17日
    000
  • 鸡尾酒排序(双冒泡排序、搅拌排序或涟漪排序)

     鸡尾酒排序(双冒泡排序、搅拌排序或涟漪排序) using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace Sort { class CockTailSorter { p…

    好文分享 2025年12月17日
    000
  • C# 冒泡排序

     c# 冒泡排序 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sort { class BubbleSorter { public static int…

    好文分享 2025年12月17日
    000
  • 排序算法测试程序入口

     排序算法测试程序入口 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;using System.Diagnostics;namesp…

    好文分享 2025年12月17日
    000
  • C#基础知识整理:.NET知识

    1、什么是.NET Framework    所谓.NET FrameWork就是一个平台,它的目的是为了跨操作系统编程。它包含了很多模块,例如有windows应用程序构件,Web开发的模块等,而不同的操作系统根据自己的特性,支持其中部分模块。NET框架是采用虚拟机运行的编程平台,以通用语言运行时(…

    好文分享 2025年12月17日
    000
  • C#数据类型

        c#的数据类型可以分为3类:数值类型,引用类型,指针类型。指针类型仅在不安全代码中使用。    值类型包括简单类型(如字符型,浮点型和整数型等),集合类型和结构型。引用类型包括类类型,接口类型,代表类型和数组类型。     值类型和引用类型的不同之处是值类型的变量值直接包含数据,而引用类型的…

    好文分享 2025年12月17日
    000
  • C#基础知识整理:C#基础(1)

    c#基本结构 using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{ class MyFirstClass { static void Main(string[] a…

    好文分享 2025年12月17日
    000
  • C#的隐式和显示类型转换

        关于隐式转换和显示转换,每种语言都有的,c#中当然也不例外。一般常用到的场合,一种是写运算表达式的时候,要保持整体的数据类型一致和计算准确,比如有一个变量a是int型,但是它是通过加减乘除得到的,那么在运算中就要考虑用显示转换,除的运算需要转换成float或double,再把结果强制转换为i…

    好文分享 2025年12月17日
    000
  • C#基础知识整理:C#类和结构(1)

    1、结构功能特性? 实现代码?结构用struct关键字定义的,与类类似,但有本质区别。结构实质是一个值类型,它不需要对分配的。结构的特性:(1)、结构作为参数传递时,是值传递。(2)、结构的构造函数必须带参数的。(3)、结构实例化可以不用new的。(4)、结构不能继承,但是可以实现接口。(5)、结构…

    好文分享 2025年12月17日
    000

发表回复

登录后才能评论
关注微信