尝试执行代码和捕捉异常
C#支持异常和异常处理程序,可以很容易地区分程序主逻辑的代码与处理错误的代码。
要想写支持异常处理的应用程序,要做下面两件事:
1.把代码放到try块中。代码运行时,会执行try块内的所有语句。如果没有任何异常,这些语句将一个个执行,直到全部执行完毕.
2.写完代码块后,要写一个或多个catch处理程序来处理可能发生的错误。每个catch处理程序都捕捉并处理特定类型的异常。
一个例子如下:
未处理的异常
如果try块抛出异常,但没有对应的catch处理程序,那么会发生什么?
可以看到int.Parse会抛出OverflowException异常,而catch处理程序目前只能捕捉FormatException异常,由于找不到匹配的catch处理程序,整个程序终止,报告发生了未处理的异常。
使用多个catch处理程序
不同错误可能抛出不同类型的异常。为了解决这个问题,可以提供多个catch处理程序
捕捉多个异常
FormatException和OverflowException都继承于SystemException,而SystemException又继承于Exception,所以捕捉Exception相当于捕捉所有可能发生的异常
如果异常与try块之后的多个catch处理程序匹配会发生什么?
假如一个处理程序捕捉FormatException,另一个捕捉Exception,最终运行哪一个?
异常发生后将运行由“运行时”法线的第一个匹配的异常处理程序,其他处理程序会被忽略。
…
…
…
Checked和unchecked整数运算
C#的int是32位大小,取值范围是 -2147483648~2147483647
在代码中可用checked和unchecked关键字选择性打开和关闭程序一个特定部分的整数溢出检查.
…
编写checked语句
checked语句是以checked关键字开头的代码块。
checked语句中的任何整数运算溢出都抛出OverflowException异常.
…
编写unchecked语句
unchecked关键字创建强制不检查溢出的代码块。永远不抛出OverflowException异常.
…
check表达式
注意:不能使用checked和unchecked关键字控制浮点运算。 checked和unchecked关键字只适合int和long等整型运算。
浮点运算永远不抛出OverflowException异常。
…
…
…
抛出异常
假如要实现一个星期名称的方法,接受int参数并返回对应的星期名称,比如int参数为1,返回Monday,2返回Tuesday. 假如传递的整数小于1或大于7,这个时候怎么办呢?
这种情况最好抛出异常,用throw语句抛出异常,如下例所示:
…
throw表达式
可用throw表达式加一个?:操作符简化代码,?:操作符相当于针对一个表达式的if…else语句。它要获取三个操作数:
条件?第一个表达式 :第二个表达式
首先求值条件,如果为true就求值第一个表达式,如果为false
就求值第二个表达式。
用法类似如下
finally块
finally块,放到其中的语句总是运行(无论是否抛出异常)
finally块要么紧接在try块之后,要么紧接catch块之后,只要程序进入与finally块关联的try块,finally总是运行,即使发生异常
|
请发表评论