错误和异常的总结

因为总结吗,,可能概念啥的比较多,大家要学着适应.

首先是C#中的异常用老处理系统级和用户级的错误状态,是一种结构化,统一的类型安全的处理机制.

因为鄙人开始想走C++的道路,所以搞过一段时间的C++,感觉C#还是和C++的异常处理有点区别的.

1.在C#中,所有的异常必须由Exception派生的类类型的实例来表示.在C++中,可以使用任何类型的任何值表示异常.

2.在C#中,利用finally块可编写正常执行和异常情况下都将执行的终止代码.在C++中,很难在不重复代码的情况下编写这样的代码.

3.C#中,系统级的异常如溢出啊,被零除无意义等都对应的定义预期匹配的异常类,并且与应用程序级的错误状态处于同等地位.

(如果你不了解C++,,如果你不了解C++,没关系,去学!学完了就会了)

导致异常的原因:(两种情况可能导致异常)

第一种:throw语句用于利己无条件的引发一场.控制永远不会执行throw后面的语句(如果你使用VS高点的版本,就会发现,如果再throw后面写点东西就会报错).

第二种:在执行C#语句和表达式的过程中,有时会出现一些例外情况,使某些操作无法完成,此时就会引发一些异常.例如,在整数触发运算中,如果分母为0,则会引发一个异常(你自己编写一个案例试试).

下面说一下所以的异常类的父类:Exception

Exception具有一些所有异常共享的值得注意的属性:

Message属性是string类型的一个只读属性,它包含关于所发生异常的原因的秒数(还记得,我在编写自定义异常类的时候怎么对待message吗?).

InnerException属性是Exception类型的一个只读属性.如果它的值不是null,则它所引用的是导致了当前一场的那个异常,即表示当前异常是在处理那个InnerException的catch块中被引发的.否则,它的值为null,则表示该异常不是由另一个异常引发的.以这种方式连接在一起的异常对象的数目可以是任意的.

这两个属性的值可以在调用Exception的实例构造函数时指定.

异常的处理方式

首先,先介绍一个概念:异常传播。当一个异常被抛出时,程序将控制权转移给try语句中的第一个能处理该异常的catch语句。这种从异常抛出到转移给合适的异常处理语句的过程就是异常传播。

异常传播包括重复执行以下步骤,直到找到一个与该异常相匹配的catch句子。

(1)由里层到外层的执行每一个包围抛出点的try语句

如果try包含一条或多条catch子句,那么将按照这些子句出现的顺序对它们逐一检查以定位适合该异常的处理。所谓适合该异常的处理,就是第一个定义了该异常类型或者其基类型的catch子句,一般catch子句可以匹配任何类型的异常,一旦找到与该类型匹配的catch子句,异常传播也就结束了,程序控制转移到该catch子句执行。

如果当前的try块包含finally块的话,就执行finally块,如果该快又抛出另外一个异常,则当前处理的异常将被终止,如果没有,当finally块执行完以后,再继续异常的处理。

(2)如果当前的成员函数调用中没能定位异常处理,则调用终止。

你能明白我想说啥吗?

using System;

class ExceptionTestClass
{
   public static void Main()
   {
      int x = 0;
      try
      {
         int y = 100/x;
      }
         catch (ArithmeticException e)
         {
            Console.WriteLine("ArithmeticException Handler: {0}", e.ToString());
         }
         catch (Exception e)
         {
            Console.WriteLine("Generic Exception Handler: {0}", e.ToString());
         }
   }
}

这里是一个try,与多个catch,异常出现后,try 将控制权转移给catch,catch中有异常变量,它的类型是从Exception继承过来的,这里的程序中,catch (ArithmeticException e) 表示有计算溢出时调用这个异常。如果改成下面的,程序会报错,
class ExceptionTestClass
{
    public static void Main()
    {
        int x = 0;
        try
        {
            int y = 100 / x;
        }

catch (Exception e)
        {
            Console.WriteLine("Generic Exception Handler: {0}", e.ToString());
        }
        catch (ArithmeticException e)
        {
            Console.WriteLine("ArithmeticException Handler: {0}", e.ToString());
        }         
    }
}

这是因为catch (Exception e)已经将catch (ArithmeticException e)包含在内了,前面不出错,是因为ArithmeticException包含不了Exception。

以上就是我想表达的意思.

接下来就是C#中那些预定义的异常类:比如ArrayTypeMismatchException

个人认为C#的异常处理机制很厉害,上手快,但是想要深入以下就很难了,对于咱们初学者,先掌握几个小例子就好了,以后再慢慢深入.

C#高级编程----错误和异常的总结的更多相关文章

  1. C#高级编程9 第16章 错误和异常

    C#高级编程9 第16章 错误和异常 了解这章可以学会如何处理系统异常以及错误信息. System.Exception类是.NET运行库抛出的异常,可以继承它定义自己的异常类. try块代码包含的代码 ...

  2. python 常见错误和异常 函数 正则表达式及多线程编程

    生成随机密码#!/usr/bin/env python import stringfrom random import choice def gen_pass(num=9): all_chs = st ...

  3. iOS网络高级编程:iPhone和iPad的企业应用开发之错误处理

    本章内容 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWluZ2h1YXdlbmthbmc=/font/5a6L5L2T/fontsize/400/fi ...

  4. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  5. Effective Java 第三版——70. 对可恢复条件使用检查异常,对编程错误使用运行时异常

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  6. C#学习笔记四(LINQ,错误和异常,异步编程,反射元数据和动态编程)

    LINQ 1.使用类似的数据库语言来操作集合? 错误和异常 异步编程 1.异步和线程的区别: 多线程和异步操作两者都可以达到避免调用线程阻塞的目的.但是,多线程和异步操作还是有一些区别的.而这些区别造 ...

  7. C#高级编程笔记(11至16章)异步/托管/反射/异常

    11.1.2LINQ语句 LINQ查询表达式以from子句开始,以select或者group子句结束.在这两个子句之间可以跟零个或者多个from.let.where.join或者orderby子句. ...

  8. (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  9. (八) 一起学 Unix 环境高级编程 (APUE) 之 信号

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. Oracle数据库常用Sql语句大全

    一,数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSE ...

  2. Java编码与乱码问题

    一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8 ...

  3. JS实现购物车01

    需求 使用JS实现购物车功能01 具体代码 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  4. js获取iframe中的元素

    var obj=document.getElementById("iframe的name").contentWindow; var ifmObj=obj.document.getE ...

  5. java 延时的几种方法方法

    Java 延时常见的几种方法   1. 用Thread就不会iu无法终止 new Thread(new Runnable() { public void run() { while (true) { ...

  6. 树链剖分边权模板spoj375

    树链剖分是树分解成多条链来解决树上两点之间的路径上的问题 如何求出树链:第一次dfs求出树上每个结点的大小和深度和最大的儿子,第二次dfs就能将最大的儿子串起来并hash(映射)到线段树上(或者其他数 ...

  7. python 全栈开发,Day85(Git补充,随机生成图片验证码)

    昨日内容回顾 第一部分:django相关 1.django请求生命周期 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这 ...

  8. websocket+Django+python+paramiko实现web页面执行命令并实时输出

    一.概述 WebSocket WebSocket的工作流程:浏览器通过JavaScript向服务端发出建立WebSocket连接的请求,在WebSocket连接建立成功后,客户端和服务端就可以通过 T ...

  9. hdu 1757 和1005差不多 (矩阵快速幂)

    If x < 10 f(x) = x.If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-1 ...

  10. POJ 2718【permutation】

    POJ 2718 问题描述: 给一串数,求划分后一个子集以某种排列构成一个数,余下数以某种排列构成另一个数,求这两个数最小的差,注意0开头的处理. 超时问题:一开始是得到一个数列的组合之后再从中间进行 ...