C#程序设计及应用-第10章_第1页
C#程序设计及应用-第10章_第2页
C#程序设计及应用-第10章_第3页
C#程序设计及应用-第10章_第4页
C#程序设计及应用-第10章_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C# 程序设计第10章 异常处理 n解释异常处理解释异常处理n使用使用throw关键字关键字n使用使用try、catch和和finally关键字关键字n捕获特定的异常类型捕获特定的异常类型n正则表达式正则表达式10.1.1 程序错误 最典型的程序错误有以下3种:(1)代码中的语法错误。(2)代码中的逻辑错误。(3)运行时错误。 10.1.1 程序错误 最典型的程序错误有以下3种:(1)代码中的语法错误。(2)代码中的逻辑错误。(3)运行时错误。 例:程序交互出错 Console.Write(请输入整数:); int x = int.Parse(Console.ReadLine(); int r

2、esult = 50 / x; Console.WriteLine(result = 0, result); Console.ReadLine();10.1.2 异常 异常是程序通过编译后,运行时由于程序对数据进行非法操作,或者对资源进行非法访问等,引起程序不能正常工作而导致程序中断的一种现象。.NET设计上让应用程序出现异常时,抛出某些类型的异常对象,其中包含了该异常的各种信息,可以被异常处理机制捕捉到,并有效地加以处理,避免应用程序执行的过程中系统崩溃和用户重要数据丢失。 10.1.2 异常 异常产生的原因主要有用户的误操作、操作系统错误、内存资源不足、硬件故障、无法连接网络或数据库等。

3、在 C# 中,程序中的运行时错误使用一种称为“异常”的机制在程序中传播。异常由遇到错误的代码引发,由能够更正错误的代码捕捉。 try/catch块是C#的异常处理的主要机制,这个机制允许把错误处理与算法的正常信息流分开。try /正常情况下,程序代码块 catch(异常类型 e) /异常处理代码块 其他catch块 finally /是否发生异常,均要执行的代码块; 使用try/catch块的一个例子 static int Zero = 0; static void Main(string args) try int j = 22 / Zero; catch (Exception e) Con

4、sole.WriteLine(异常: + e.Message+被捕获!); Console.WriteLine(捕获之后执行的语句); 10.1.2 异常 异常在以下两种情况下抛出: (1)使用throw语句会直接无条件地抛出一个异常。控制不会接触到紧跟在throw后面的语句。 (2)当运算符不能正常结束时。在某种特殊情况下,在C#语句和表达式执行的过程中产生某种异常。 使用try/catch块的一个例子 try Console.Write(n请输入一个整数:); string s = Console.ReadLine(); int x = int.Parse(s); int y = 100

5、/ x; Console.WriteLine(y = 0, y); break; catch (DivideByZeroException e) Console.WriteLine(e.Message); catch (FormatException e) Console.WriteLine(e.Message); catch (Exception e) Console.WriteLine(e.Message); 10.1.2 异常 在try块的代码中出现异常后, 发生的事件依次是: (1)try块在发生异常的地方中断程序的执行。 (2)如果有catch块,就检查该块是否匹配于已发生的异常类型

6、。如果没有catch块,就执行finally块。 10.1.2 异常 在try块的代码中出现异常后, 发生的事件依次是: (3)如果有catch块,但它与已发生的异常类型不匹配,就检查是否有其他catch块。 (4)如果有catch块匹配于已发生的异常类型,就执行包含的代码,再执行finally块(如果有)。 (5)如果异常类型找不到匹配的catch块时,就执行finally块(如果有) finally块总是被执行 try Console.WriteLine(try); goto leave; finally Console.WriteLine(inally); leave: Console.

7、WriteLine(leave);10.1.3 抛出异常 使用throw语句抛出异常,其一般形式如下所示: throw 表达式;例:抛出DivideByZeroException异常的throw语句 try Console.WriteLine(抛出异常之前。); throw new DivideByZeroException(); catch (DivideByZeroException) Console.WriteLine(捕获到异常。); Console.WriteLine(try/catch语句之后。);10.2 异常类 C#语言定义了很多异常类,每个异常类代表着一种程序运行时错误,类中

8、包含了运行时错误的信息和处理错误的方法等内容。C#语言的异常类都是由System.Exception类派生的。 10.2.1 Exception类Exception类定义了几个属性,其中最主要的3个属性是Message、StackTrace和TargetSite,并且这3个属性都是只读的。Message属性是描述错误的性质的字符串;StackTrace属性是包含导致异常的调用栈的字符串;TargetSite属性返回一个对象,指定生成异常的方法。10.2.1 Exception类Exception还定义了几个方法。最常用的方法是ToString(),该方法是返回描述异常的字符串。例如,当通过Wr

9、iteLine()显示异常时,自动调用ToString()。 Exception类的属性和方法 class ExcTest public static void GenException() int nums = new int4; Console.WriteLine(异常发生之前。); nums7 = 10; Console.WriteLine(这的文本将不会被显示!); try ExcTest.GenException(); catch (IndexOutOfRangeException exc) Console.WriteLine(异常的标准信息是:); Console.WriteLin

10、e(exc); Console.WriteLine(Stack trace属性值是: + exc.StackTrace);Console.WriteLine(Message属性值是: + exc.Message);Console.WriteLine(TargetSite属性值是: + exc.TargetSite); Console.WriteLine(catch块之后语句); Console.ReadLine(); 10.2.1 Exception类Exception类中常见的构造函数有种:public Exception( ) public Exception(string str) pu

11、blic Exception(string str, Exception inner) 10.2.2 自定义异常 创建自定义异常类会自动使Exception类定义的属性和方法可用。当然,在创建的异常类中重写一个或多个这样的成员。当创建自定义的异常类时,一般会希望创建的类支持由Exception定义的所有构造函数。 自定义异常 class LbException : Exception / 定义异常的构造函数 public LbException() : base() public LbException(string str) : base(str) public LbException(st

12、ring str, Exception inner) : base(str, inner) / 重载LbException的ToString的方法 public override string ToString() return Message; int numer = 4, 8, 15, 32, 64, 127, 256, 512 ; int denom = 2, 0, 4, 4, 0, 8 ; for (int i = 0; i numer.Length; i+) try if (numeri % denomi) != 0) throw new LbException(numeri + /

13、 + denomi + 不是偶数。); Console.WriteLine(numeri + / +denomi + 是 + numeri / denomi); catch (DivideByZeroException) Console.WriteLine(不能被0整除!); catch (IndexOutOfRangeException) Console.WriteLine(没有匹配的元素被发现。); catch (LbException exc) Console.WriteLine(exc); 10.2.3 Checked和unchecked语句1Checked语句Checked 关键字用

14、于对整型算术运算和转换的溢出检查,检查表达式是否产生溢出,在发生溢出时,系统会抛出一个异常。默认情况下,如果表达式产生的值超出了目标类型的范围,则常数表达式将引起编译时错误,如果不是常数表达式在运行时计算所引发的异常。 Checked语句的使用 class OverFlowTest static short x = 32767; / 最大数 static short y = 32767;static int CheckedMethod() int z = 0; try z = checked(short)(x + y); catch (System.OverflowException e) C

15、onsole.WriteLine(e.ToString(); return z; class Program static void Main(string args) Console.WriteLine(Checked的输出值是:0,CheckedMethod(); Console.ReadLine(); 2unchecked unchecked 关键字用于取消整型算术运算和转换的溢出检查。在未检查的上下文中,如果表达式产生目标类型范围之外的值,则结果被截断。例如:unchecked int val = 2147483647 * 2;unChecked语句的使用 const int x =

16、2147483647; const int y = 2; static void Main(string args) int z; unchecked z = x * y; Console.WriteLine(unchecked输出值是:0, z);10.3.1 正则表达式的基本概念 正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。正则表达式由一些普通字符和一些元字符(metacharacters)组成,其中普通字符包括大小写的字母和数字,而元字符则是一些具有特殊含义的字符。 10.3.1 正则表达式的基本概念 通过使用正则表达式,可以解决如下问题: (1)测试字

17、符串内的模式。例如,测试输入字符串,以检测字符串内是否出现电话号码模式或信用卡号码模式,这种方式称为数据验证。 (2)替换文本。使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 (3)基于模式匹配从字符串中提取子字符串。 (4)可以查找文档内或输入域内特定的文本。 1. 句点符号 正则表达式中的句点符号“.”表示可以匹配任意一个字符。包括空格、Tab字符甚至换行符。 2. 方括号符号在方括号(“”)里面指定所需要匹配的字符。即只有方括号里面指定的字符才参与匹配。例如,正则表达式“taeion”只匹配“tan”、“ten”、“tin”和“ton”。但“Toon”不匹配,

18、因为在方括号之内只能匹配单个字符3. 表示匹配次数的符号 下面列出了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:*:零次或多次匹配前面的字符或子表达式。+:一次或多次匹配前面的字符或子表达式。?:零次或一次匹配前面的字符或子表达式。3. 表示匹配次数的符号 下面列出了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:n:n 是非负整数。正好匹配 n 次。n,:n 是非负整数。至少匹配 n 次。n,m:m 和 n 是非负整数,其中 n = m。匹配至少 n 次,至多 m 次。4.“否”符号“”符号称为“否”符号。如果用在方括号内,“”表示不想要匹配的字符

19、。例如,“XxA-Za-z+”的正则表达式匹配所有单词,但以“X”字母开头的单词除外。需要强调的是“”在正则表达式方括号外的第一个位置表示匹配输入字符串开始的位置。 5. 圆括号和空白符号假设要从格式为“June 26,1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式如下所示:(a-z+)s+0-91,2,s*0-946. 其它符号 可以使用一些为常见正则表达式创建的快捷符号,主要有:d:数字字符匹配。等效于 0-9。 D:非数字字符匹配。等效于 0-9。 s:匹配任何空白字符,包括空格、制表符、换页符等。与 fnrtv 等效。6. 其它符号 可以使用一些为常见正则表达式创建的

20、快捷符号,主要有:S:匹配任何非空白字符。与 fnrtv 等效。 w:匹配任何字类字符,包括下划线。与“A-Za-z0-9_”等效。 W:与任何非单词字符匹配。与“A-Za-z0-9_”等效。10.3.2 正则表达式类 C#提供System.Text.RegularExpressions包含一些类,这些类提供对 .NET Framework 正则表达式引擎的访问。该命名空间提供正则表达式功能,可以从运行在 Microsoft .NET Framework 内的任何平台或语言中使用该功能 1Regex类 Escape对字符串中的regex中的转义符进行转义; IsMatch如果表达式在字符串中匹

21、配,该方法返回一个布尔值; Match返回Match的实例; Matches返回一系列的Match的方法; Replace用替换字符串替换匹配的表达式; Split返回一系列由表达式决定的字符串; Unescape不对字符串中的转义字符转义。例:IsMatch方法 Regex rx = new Regex(-?d+(.d1,2)?$);string tests = -42.1, 19.99, 0.001, 100 USD ;foreach (string test in tests) if (rx.IsMatch(test) Console.WriteLine(0 符合正则表达式要求。, te

22、st); else Console.WriteLine(0 不符合正则表达式的要求。, test); 例:Replace()方法 string input = This is text with far too much + whitespace.; string pattern = s+; string replacement = ; Regex rgx = new Regex(pattern); string result = rgx.Replace(input, replacement); Console.WriteLine(原始字符串是:0, input); Console.Write

23、Line(替换后字符串是: 0, result); Split()方法 Split()方法实际上是拆分的方法,根据匹配正则表达式进行拆分储存在字符串数组中。 例:从一个群发邮件地址中读取所有邮件地址 Regex regex = new Regex(;); string substrings = regex.Split(;);foreach (string match in substrings) Console.WriteLine(0, match); 2. Match类 Match 类表示正则表达式匹配操作。 如果 Regex.Matches 方法无法与输入字符串中的正则表达式模式匹配,将返

24、回一个空的 MatchCollection 对象。 然后,可以使用 C# 中的 foreach 构造来循环访问集合。 如果 Regex.Match 方法无法与正则表达式模式匹配,将返回一个等于 Match.Empty 的 Match 对象。可以使用 Success 属性来确定匹配是否成功。 例:Match对象的匹配方法 Regex r = new Regex(abc); Match m = r.Match(123abc456); Console.WriteLine(发现匹配,匹配位置是: + m.Index); else Console.WriteLine(没有发现匹配! ); 例:检索输入字

25、符串中的所有模式匹配项 string input = 123abc45abc6abc; string pattern = abc?; MatchCollection matches = Regex.Matches(input, pattern); foreach (Match match in matches) Console.WriteLine(0被发现在源串的位置是:1。,match.Value, match.Index);Console.ReadLine();例:检索输入字符串中的所有模式匹配项 string input = 123abc45abc6abc; string pattern

26、 = abc?; Match match = Regex.Match(input, pattern);while (match.Success) Console.WriteLine(0发现在源串的位置是:1。, match.Value, match.Index); match = match.NextMatch(); 3. Capture类 Capture类表示来自单个成功的子表达式捕获的结果。Capture 对象没有公共构造函数,其实例通过 CaptureCollection 对象返回,该对象由 Match.Captures 和 Group.Captures 属性返回。例:Capture类用

27、法 string input = Hello world.;string pattern = (w+)s.)+;foreach (Match match in Regex.Matches(input, pattern) Console.WriteLine(Match: 0, match.Value); for (int groupCtr = 0; groupCtr match.Groups.Count; groupCtr+) Group group = match.GroupsgroupCtr; Console.WriteLine( Group 0: 1, groupCtr, group.Value); for

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论