0

0

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

黄舟

黄舟

发布时间:2017-02-11 13:29:53

|

1515人浏览过

|

来源于php中文网

原创

    往往我们在写代码的时候,总会在运行中遇到某些问题而导致程序崩溃。这并不是编程人员的水平不行,而是由业务逻辑,操作系统,或者电脑等其它设备出现问题而造成,比如在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 <= 0 || 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("木有抛出异常");
        }
    }

//调用:

医院网站系统
医院网站系统

HTML医院网站系统基于PHP+MYSQL开发,在文章内容网站的基础上,预设了医院概况、新闻动态、环境设备、名医荟萃、专科介绍、就医指南、专家门诊值班表、网上挂号、医疗保健知识、在线咨询等医院网站常用的栏目和测试数据,采用适合医院网站的专用模版,增强了系统的针对性和易用性。系统具有文章、图文、下载、社区、表单、用户等基本系统模块和一系列网站辅助功能,用户也可根据自身特点任意创建和修改栏目,适合创建

下载
   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)!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

32

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

16

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

268

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

195

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

170

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

85

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 8.2万人学习

C 教程
C 教程

共75课时 | 4.4万人学习

C++教程
C++教程

共115课时 | 15.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号