C#高级编程----错误和异常的总结

错误和异常的总结

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

首先是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#的异常处理机制很厉害,上手快,但是想要深入以下就很难了,对于咱们初学者,先掌握几个小例子就好了,以后再慢慢深入.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-16 07:35:44

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

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

本章内容 ●    iOS应用中的网络错误源 ●    检测网络的可达性 ●    错误处理的经验法则 ●    处理网络错误的设计模式 到目前为止,我们所介绍的iPhone与其他系统的网络交互都是基于一切正常这个假设.本章将会放弃这个假设,并深入探究网络的真实世界.在真实世界中,事情是会出错的,有时可能是非常严重的错误:手机进入与离开网络.包丢掉或是延迟:网络基础设施出错:偶尔用户还会出错.如果一切正常,那么编写iOS应用就会简单不少,不过遗憾的是现实并非如此.本章将会探讨导致网络操作失败的几

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

原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) 得到了大家的强力支持与建议,万分感谢.接下来介绍下一篇:oracle pl/sql异常处理部分,还望大家一定

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

[推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) 得到了大家的强力支持与建议,万分感谢.接下来介绍下一篇:oracle pl/sql异常处理部分,还望大家一定要支持与推荐呀~! 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常

10 错误和异常 - 《Python 核心编程》

?? 什么是异常? ?? Python 中的异常 ?? 探测和处理异常 ?? 上下文管理 ?? 引发异常 ?? 断言 ?? 标准异常 ?? 创建异常 ?? 相关模块 10.1 什么是异常人们需要一个"柔和"的处理错误的方法, 而不是终止程序. 错误 从软件方面来说, 错误是语法或是逻辑上的. 当 Python 检测到一个错误时, 解释器就会指出当前流已经无法继续执行下去. 这时候就出现了异常. 语法错误 语法错误指示软件的结构上有错误, 导致不能被解释器解释或编译器无法编译. 逻辑错误

中文版C#高级编程第8版中的翻译错误

第180页,倒数第三行. 英文原文: If you overload == and !=, you must also override the Equals() and GetHashCode() methods inherited from System.Object; 中文译文: 在重载"=="和"!="时,还必须重载(应该是:重写)从System.Object中继承的Equals()和GetHashCode()方法. 中文版C#高级编程第8版中的翻译错误,布

《Python核心编程》 第十章 错误和异常

10–1. 引发异常. 以下的哪个因素会在程序执行时引发异常? 注意这里我们问的并不是异常的原因. a) 用户 b) 解释器 c) 程序 d) 以上所有 e) 只有 b) 和 c) f) 只有 a) 和 c) 答:f 10–2. 引发异常. 参考上边问题的列表, 哪些因素会在执行交互解释器时引发异常? 答:f 10–3. 关键字. 用来引发异常的关键字有那些? 答:raise 10–4. 关键字. try-except 和 try-finally 有什么不同? 答: 你可以使用 try-exce

C#高级编程八十天----异常类

异常类 在C#里,异常处理就是C#为处理错误情况提供的一种机制.它为每种错误情况提供了定制的处理方式,并且把标志错误的代码预处理错误的代码分离开来. 对.net类来说,一般的异常类System.Exception派生于System.Object.还有许多定义好的异常类(例如:System.SystemExpection,SYstem.ApplicationException等),他们又派生于System.Exception类.其中System.ApplicationException类是第三方定

OC高级编程——深入block,如何捕获变量,如何存储在堆上

首先先看几道block相关的题目 这是一篇比较长的博文,前部分是block的测试题目,中间是block的语法.特性,block讲解block内部实现和block存储位置,请读者耐心阅读.具备block基础的同学,直接调转到block的实现 下面列出了五道题,看看能否答对两三个.主要涉及block栈上.还是堆上.怎么捕获变量.答案在博文最后一行 //-----------第一道题:-------------- void exampleA() { char a = 'A'; ^{ printf("%

Python3 面向对象 高级编程

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.  class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 还可以尝试给实例绑定一个方法: >>> def set_age(self, age): # 定义一个函数作为实例方法 ...