扣响C#开发之门---第十二章

12.1 异常概述

异常:异常就是程序执行期间发生的问题。异常发生的原因不一定都在程序上,比如用户输入非法数据,读取不存在的文件等等;

如:

    class Program
    {       static void Main(string[] args)
        {
            Console.WriteLine("输入分母");
            int de = Convert.ToUInt16(Console.ReadLine());//如果Console.ReadLine()无法转为数字,产生异常
            double result = 100 / de;   //de=0如果产生异常
            Console.WriteLine("100/{}=",de);
            Console.ReadKey();
        }
    }

12.2捕获异常 try...catch...

C#中使用 try...catch来捕获异常并处理,我们 将可能出现异常的语句放在try语句块中,把异常发生后的处理代码放在catch块中;

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("输入分母");
            try                        // try语句块
            {
                int de = Convert.ToUInt16(Console.ReadLine());
                double result = 100 / de;
                Console.WriteLine("100/{}=", de);
                Console.ReadKey();
            }
            catch (DivideByZeroException)  // catch语句块,可有对多
            {
                Console.WriteLine("DivideByZeroException");
                Console.ReadKey();
            }
            catch (FormatException)
            {
                Console.WriteLine("FormatException");
                Console.ReadKey();
            }
        }
    }

12.3 try...catch...final 

(1)在某些问题上,无论是否出现 异常,都有些收尾工作需要处理,此时就用到了finally,如果加上了finally语句块,则finally语句块无论程序是否发生异常都会执行;

(类似于资源释放等代码通常放在fanally里面,表示是否发生异常,都释放资源);

try catch finally 执行过程如下:

eg:

 static void Main(string[] args)
        {
            Console.WriteLine("输入分母");
            try
            {
                int de = Convert.ToUInt16(Console.ReadLine());
                double result = 100 / de;
                Console.WriteLine("100/{}=", de);
                Console.ReadKey();
            }
            catch (DivideByZeroException)
            {
                Console.WriteLine("DivideByZeroException");
                Console.ReadKey();
            }
            catch (FormatException)
            {
                Console.WriteLine("FormatException");
                Console.ReadKey();
            }
            finally
            {     //finally,无论是否发生异常,finally都会执行
                Console.WriteLine("是否发生异常,finally都会执行");
                Console.ReadKey();
            }
        }

(2)规则

(a)如果try语句后有catch语句,则finally是可选的;

(b)如果try语句后面没有cactch语句,则必须加finally语句(也就是catch或者finally必须有一个):注意finally只能有一个

(c)如果有catch语句,则finally必须放在所欲catch语句后面;

12.4 抛出异常

.NET 可以用try自动检测异常,但是有时候我们需要人工抛出异常。此时就需要throw语句;

throw使用方法:

static void Main(string[] args)
        {
            Console.WriteLine("输入一个1到10之间的数字");
            int i;
            try
            {
                i=Convert.ToInt16(Console.ReadLine());
            if (i>10||i<1)
            {
                throw new IndexOutOfRangeException(); //抛出系统以异常,注意IndexOutOfRangeException 是系统定义的异常类
             } 

         else { Console.WriteLine("输入正确"); } } catch (IndexOutOfRangeException) { Console.WriteLine("超出范围");      }

12.5 .NET 中的异常类

(1)异常类没有固定的名字空间,哪个类发生异常,异常就放在哪个名字空间;

(2).NET中所有的异常类都派生于SystemException,而用户自定义的异常类都派生于ApplicationException

(3)由于派生类属于基类,所以有多catch语句时候,一定要按照从一般到具体的顺序从上到下排列,基类必须放在最后,

否则派生类的catch语句块可能永远没有机会执行了(目前最新的.NET直接报错无法编译);

 catch (SystemException)
            { 

            }
            catch (DivideByZeroException)  //错误    上一个 catch 子句已经捕获了此类型或超类型

            {
                Console.WriteLine("DivideByZeroException");
                Console.ReadKey();
            }
            catch (FormatException)
            {
                Console.WriteLine("FormatException");
                Console.ReadKey();
            }

(4)我们可以不给catch指定异常类型,此时catch则可以捕获任何异常;

           try
            {
                int de = Convert.ToUInt16(Console.ReadLine());
            }
            catch { }

12.6 异常类的属性:

Exception类和其他类一样有几个公共属性,比较重要的是以下两个;

Message:用于描述异常产生的原因;

Stacktrace:用于描述异常的堆栈信息,即异常发生的位置;

可以在catch语句声明一个异常类的对象,可以利用这个对象使用Exception的属性

eg:

 try
            {
                int de = Convert.ToUInt16(Console.ReadLine());
                double result = 100 / de;
                Console.WriteLine("100/{}=", de);
                Console.ReadKey();
            }

            catch (DivideByZeroException e)     //声明异常形参
            {
                Console.WriteLine("Message:" + e.Message);  //异常信息
                Console.WriteLine("StackTrace" + e.StackTrace); //异常位置
                Console.WriteLine("Source" + e.Source);
                Console.ReadKey();
            }

12.7 自定义异常类:

我们也可以自己定义异常类,用户定义的异常类都需直接或者间接继承于ApplacationException类

//定义自己异常类
    class NegativeNumberExcption:ApplicationException
    {
        public NegativeNumberExcption():base("对负值就行了非法操作")
        {
        }

        public NegativeNumberExcption(string message) : base(message)
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("数字");
            try
            {
                int de = Convert.ToInt16(Console.ReadLine());
                double resule = 0;
                if (de < 0)
                {
                    throw new NegativeNumberExcption("负数不能开平方");
                }
                else
                    resule = Math.Sqrt(de);
            }
            catch (FormatException)
            {

            }
            catch (NegativeNumberExcption w)
            {
                Console.WriteLine(w.Message);
                Console.WriteLine(w.StackTrace);
            }

            Console.ReadLine();

        }
    }
时间: 2024-10-13 20:52:37

扣响C#开发之门---第十二章的相关文章

IO流入门-第十二章-ObjectInputStream_ObjectOutputStream

DataInputStream和DataOutputStream基本用法和方法示例,序列化和反序列化 import java.io.Serializable; //该接口是一个"可序列化"的 ,没有任何方法,是一个标识接口,还有Cloneable /* 标识接口的作用:标识作用,JVM如果看到对象实现了某个标识接口,会对它特殊待遇,会给该类添加一个属性,static final long serialVersionUID=xxx, 最好是自己指定一个唯一的,这样不会产生类的兼容问题.

MiS603开发板 第十二章 SLAVE FIFO流传输

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十二章 SLAVE FIFO流传输 15.1 USB 固件源码分析 SLAVE FIFOUSB 固件源码仍然采用上

《构建之法》第十一、十二章学习总结

第十一章的内容是软件设计与实现. 在第一节中,讲的是关于分析和设计方法,向我们介绍在"需求分析"."设计与实现"阶段."测试""发布"阶段该搞清楚的问题. 在第二节中,讲的是关于图形建模和分析方法.在表达实体和实体之间的关系时,可以用到思维导图(Mind Map).实体关系图(ERD).UCD ;在表达数据的流动时,可以用到DFD工具:在表达控制流的时候可以用到FSM工具:前面提到的这些图形建模方法各有特点,UML却可以有一个

JavaScript DOM编程艺术-学习笔记(第十二章)

第十二章 1.本章是综合前面章节的所有东西的,一个综合实例 2.流程:①项目简介:a.获取原始资料(包括文本.图片.音视频等) b.站点结构(文件目录结构) c.页面(文件)结构 ②设计(切图) ③css -  base.css用于引入使用的css文件 color.css  - 用于设置样式 layout.css - 用于设置布局 Typography.css - 用于设置版式 3.题外话:①在实际开发中,即使是一个空白项目也往往不会从一无所有做起,而借助的平台一般会提供目录结构,所以需要把自己

Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 这一章很多,但是很有趣,也是这书的最后一章知识点了,我现在还在考虑要不要写这个拼图和2048的案例,在此之前,我们先来玩玩Android5.X的新特性吧!

进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢.所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量.所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来

[CSAPP笔记][第十二章并发编程]

第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟悉的例子. 我们主要将并发看做是一种操作系统内核用来运行多个应用程序的机制. 但是,并发不仅仅局限于内核.它也可以在应用程序中扮演重要的角色. 例如 Unix信号处理程序如何允许应用响应异步事件 例如:用户键入ctrl-c 程序访问虚拟存储器的一个未定义的区域 其他情况 访问慢速I/O设备 当一个应

Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,兼容

第十二章、软件包管理

第十二章.软件包管理 本章内容 ?软件运行环境 ?软件包基础 ?rpm包管理 ?yum管理 ?定制yum仓库 ?编译安装 软件运行和编译 ABI:Application Binary Interface Windows与Linux不兼容 ELF(Executable and Linkable Format) PE(Portable Executable) 库级别的虚拟化: Linux: WINE Windows: Cywin API:Application Programming Interfa