C#讲义-异常处理_第1页
C#讲义-异常处理_第2页
C#讲义-异常处理_第3页
C#讲义-异常处理_第4页
C#讲义-异常处理_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、异常处理1错误 bug 和异常n错误:由用户的行为而导致。如:用户在应输入数字时输入字符。 用验证代码(validation code)来捕捉错误。nbug:代码本身的失误。n为所有的错误做了准备,消除了所有的bug。仍然会出现可预见到而又无法防范的问题。如内存耗尽,打开不存在的文件。称为异常。n异常无法防范,但可以处理,避免程序崩溃。n当程序遇到异常时,当前函数的执行会被停止,调用堆栈展开,直至找到正确的异常处理代码。n如最终未找到处理代码。将由CLR处理。CLR将终止进程。2抛出异常 public class Test public static void Main() Console.W

2、riteLine( Enter Main. ); Test t = new Test(); t.Func1(); Console.WriteLine( Exit Main. ); public void Func1() Console.WriteLine( Enter Func1. ); Func2(); Console.WriteLine( Exit Func1. ); 3 public void Func2() Console.WriteLine( Enter Func2. ); throw new System.Exception(); Console.WriteLine( Exit F

3、unc2. ); n程序执行过程:Enter Main.Enter Func1.Enter Func2.未处理的异常: System.Exception: 引发类型为“System.Exception”的异常。 在 ThrowingAnException.Test.Func2() 行号 32 在 ThrowingAnException.Test.Func1() 行号 25 在 ThrowingAnException.Test.Main() 行号 17请按任意键继续. . .4捕获异常 public class Test public static void Main() Console.Wri

4、teLine( Enter Main. ); Test t = new Test(); t.Func1(); Console.WriteLine( Exit Main. ); public void Func1() Console.WriteLine( Enter Func1. ); Func2(); Console.WriteLine( Exit Func1. ); 5 public void Func2() Console.WriteLine( Enter Func2. ); try Console.WriteLine( Entering try block. ); throw new S

5、ystem.Exception(); Console.WriteLine( Exiting try block. ); catch Console.WriteLine( Exception caught and handled. ); Console.WriteLine( Exit Func2. ); 使用catch语句捕获异常throw语句在try语句中执行n程序执行过程Enter Main.Enter Func1.Enter Func2.Entering try block.Exception caught and handled.Exit Func2.Exit Func1.Exit Ma

6、in.请按任意键继续. . .n异常抛出时,执行立即停止,并转到catch块。此后,再也没有返回原来的代码路径。因此try中有一句未执行的语句。 catch完成后,继续执行。6展开调研堆栈n异常发生时,如未遇到catch,调用堆栈需要逐级展开,直至遇到catch,异常得到处理,然后程序继续进行。n以下例子更清楚展示其过程:7在调用中捕获异常 public class Test public static void Main() Console.WriteLine( Enter Main. ); Test t = new Test(); t.Func1(); Console.WriteLine(

7、 Exit Main. ); public void Func1() Console.WriteLine( Enter Func1. ); try Console.WriteLine( Entering try block. ); Func2(); Console.WriteLine( Exiting try block. ); catch Console.WriteLine( Exception caught and handled. ); Console.WriteLine( Exit Func1. ); 8 public void Func2() Console.WriteLine( E

8、nter Func2. ); throw new System.Exception(); Console.WriteLine( Exit Func2. ); 执行过程:Enter Main.Enter Func1.Entering try block.Enter Func2.Exception caught and handled.Exit Func1.Exit Main.请按任意键继续. . .n异常在Func1,即Func2的调用者上处理的。 在Func2上,异常产生,执行停止,未找到异常处理,展开堆栈,在Func1上找到处理,调用catch,然后程序在catch后面恢复运行。9创建专有的

9、catch语句n异常多种多样,可以选择性地处理。n一般先处理特别的,然后处理一般的。10 public static void Main() Test t = new Test(); t.TestFunc(); public void TestFunc() / 除法处理各种异常 try double a = 5; double b = 0; Console.WriteLine( 0 / 1 = 2, a, b, DoDivide( a, b ) ); catch ( System.DivideByZeroException ) / 特别异常,除以0. Console.WriteLine( Di

10、videByZeroException caught! ); catch ( System.ArithmeticException ) Console.WriteLine( ArithmeticException caught! ); catch/ 一般的异常 Console.WriteLine( Unknown exception caught ); 11 / do the division if legal public double DoDivide( double a, double b ) if ( b = 0 ) throw new System.DivideByZeroExcep

11、tion(); if ( a = 0 ) throw new System.ArithmeticException(); return a / b; 1.以上两个catch语句不能调换顺序,否则除以0异常处理程序无法运行。2.可以将try catch 分开,在某方法中捕获某种异常,而在更高层的调用方捕获一般的异常。12finally 语句。n有些操作无论是否抛出异常都要执行。1.可在try和catch中重复。2.使用finally语句比如打开了某文件,无论如何都要关闭。13try Console.WriteLineConsole.WriteLine(“open file here”(“open

12、 file here”); ; double a = 5; double b = 0; Console.WriteLine( 0 / 1 = 2, a, b, DoDivide( a, b ) ); catch ( System.DivideByZeroException ) / 特别异常,除以0. Console.WriteLine( DivideByZeroException caught! ); catch ( System.ArithmeticException ) Console.WriteLine( ArithmeticException caught! ); catch/ 一般的

13、异常 Console.WriteLine( Unknown exception caught ); finallyfinally Console.WriteLineConsole.WriteLine(“Close file here”);(“Close file here”); 14Exception 对象。nException对象包含一些属性供用户使用:n自定义的消息。n自定义的帮助文档链接n堆栈跟踪,以明确事故发生的过程。15 public class Test public static void Main() Test t = new Test(); t.TestFunc(); pub

14、lic void TestFunc() try Console.WriteLine( Open file here ); double a = 12; double b = 0; Console.WriteLine( 0 / 1 = 2, a, b, DoDivide( a, b ) ); Console.WriteLine( This line may or may not print ); 16catch ( System.DivideByZeroException e ) / 显示异常信息显示异常信息 Console.WriteLine( nDivideByZeroException!

15、Msg: 0, e.Message ); / 显示异常帮助显示异常帮助 Console.WriteLine( nHelpLink: 0, e.HelpLink ); / 显示堆栈展开过程显示堆栈展开过程 Console.WriteLine( nHeres a stack trace: 0n, e.StackTrace ); catch (System.Exception e) Console.WriteLine(Unknown exception caught + e.Message ); finally Console.WriteLine( Close file here. ); 17pub

16、lic double DoDivide( double a, double b ) if ( b = 0 ) / 自定义的异常信息,也可使用默认的。 DivideByZeroException e = new DivideByZeroException(你试图除以零,计算机无法处理); / 自定义的帮助 e.HelpLink = /wiki; throw e; if ( a = 0 ) throw new ArithmeticException(); return a / b; 18n执行过程:Open file hereDivideByZeroEx

17、ception! Msg: 你试图除以零,计算机无法处理HelpLink: /wikiHeres a stack trace: 在 ExceptionObject.Test.DoDivide(Double a, Double b) 位置 行号 68在 ExceptionObject.Test.TestFunc() 位置 行号 28Close file here.请按任意键继续. . .19自定义异常n可以自定义异常。 public class MyCustomException : System.ApplicationException public

18、 MyCustomException( string message ): base(message) 20重新抛出异常n有时可能需要catch执行一些操作,再把异常重新抛出给上层的try捕捉。n可抛出同一异常,也可新的异常。n如果是新的异常,可把原异常嵌入到新异常中,以便使调用方理解异常的过程。n新异常的InnerException可以用来获取原异常。21 public MyCustomException( string message, Exception inner ): / 自定义的异常 base(message,inner) public class Test public stat

19、ic void Main() Test t = new Test(); t.TestFunc(); / 主函数 public void TestFunc() try DangerousFunc1(); catch ( MyCustomException e ) Console.WriteLine( n0, e.Message ); Console.WriteLine( Retrieving exception history. ); Exception inner = e.InnerException; / 显示异常历史显示异常历史 while ( inner != null ) Console.WriteLine( 0, inner.Message ); inner = inner.InnerException; Console.Write(e.ToString(); 22 public void DangerousFunc1() try DangerousFunc2(); catch ( System.Exce

温馨提示

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

评论

0/150

提交评论