黑马程序员技术交流社区

标题: 入学测试中,写博客。刚写的try-catch异常处理 [打印本页]

作者: Kevion小远    时间: 2014-7-30 21:51
标题: 入学测试中,写博客。刚写的try-catch异常处理
try-catch异常处理说白了就是处理处理异常的,那么什么时候应该抛异常?比如当一个类型的成员(如方法,属性)不能完成任务时,就应抛出异常。

public bool TestFunc(string input)
        {
            return input.Substring(1, 1).ToUpper().EndsWith("E");
        }
我们没有做任何的参数检查,而直接调用了一长串的方法。当input参数为null或空时,上面的代码就会抛出异常。即使方法为没有返回值的void型也应该报告错误。那么这时候就要用到处理异常的机制了,在.net中就叫异常处理。

语法如下
try
        {  //这里是TRY开始,程序开始捕获异常
           //如果有异常  进入 catch {} 然后再进入 finally{}
           //如果没异常 直接进入 finally{}
            //Try结束
        }
        catch (SqlException ex)
        {
            //catch  有异常才会进入我这里
        }
        finally
        {
            //无论如何都会进入我这里,这里适合做一些释放资源的事情
            //这里可以舍去不用
        }
Try块中包含的代码通常需要执行一些操作:抛出异常需要从异常中恢复。异常恢复的代码应放在一个或多个catch块中。针对应用程序能从中安全恢复的每一种异常,都应创建一个catch块。一个try块至少要有一个catch块或 finally块。单独的try块没有意义。如果一个try块中执行多个可能抛出同一异常的操作,但这些操作有不同的恢复措施,那么对每一个操作都应放在一个单独的try块中。

Catch块是响应一个异常需要处理的代码,catch关键字后的圆括号内的表达式称为捕捉类型(catch type)。在C#中,必须将捕捉类型指定为System.Exception或它的派生类型。没有捕捉类型的catch块将捕捉剩余的所有异常。多个 Catch块的顺序应将派生程度最大的类型放在最前面,最后放System.Excepton或没有捕捉类型的catch块。如果顺序错误会导致编译错 误。

    如果在try块中抛出一个异常,CLR将搜索捕捉类型与异常类型相同的catch块,如果没有找到,CLR会调用栈的更高一层搜索与异常类型匹配的捕捉类型,如果到了栈的顶部还未找到,就会发生一个未处理异常。一旦找到一个匹配的catch块,所有内层的finally块会被执行;如果没有找到,内层的 finally块是不会执行的,这一点要特别注意。接着执行匹配catch块内容,最后是该catch块对应的finally块(如果有的话)。

    对于匹配的catch块,我们通常的处理有3种:

1、重新抛出相同的异常,向上一层栈通知该异常的发生。

2、抛出一个不同的异常,向上一层栈提供更丰富的异常信息。

3、让线程从catch块的底部退出。(表示已处理这个异常,不会发生新的异常)

可以通过向AppDomain的FirstChanceException事件登记,只要在这个AppDomain内发生的异常,它就会收到通知。


Finally块的代码是保证会执行的代码。通常,finally块的代码执行try块中要求资源清理的操作。
Finally的用法:
try
            {
                //需要执行的代码放在这里
            }
            catch (InvalidOperationException)
            {
                //从InvalidOperationException恢复的代码放在这里
            }
            catch (IOException)
            {
                //从IOException恢复的代码放在这里
            }
            catch
            {
                //从除上面的异常外的其他异常恢复的代码放在这里
                //???
                //捕捉到任何异常,通常要重新抛出异常。
                throw;
            }
            finally
            {
                //这里的代码总是执行,对始于try块的任何操作进行清理
            }
            // 如果try块没有异常,或异常被捕获后没有抛出,就执行这里的代码


举个例子:
            FileStream fs = null;
            try {
                fs = new FileStream(pathName, FileMode.Open);
                //处理文件的数据
            }
            catch (IOException) {
                //在这里添加从IOException恢复的代码
            }
            finally {
                //确保文件关闭
                if (fs != null)
                    fs.Close();
            }      
这就是finally的语法和用法。



以上就是学习异常处理的时候的心得和体会。
作者: 蜗牛阿布    时间: 2014-8-3 21:41
你博客要写在你建立的学习笔记,博客里。我看你写的比较官方,或许你结尾用一句话总结 try catch finally 到底是什么,什么情况用,就OK了?:)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2