.NET的异常处理机制用来发现、处理运行时错误。如果开发人员没有提供异常的处理机制,就默认采用.NET的机制。

通常使用try...catch...finally捕获异常。

try
{
    //有可能发生异常
}
catch(Exception ex)
{
    //处理异常
}
finally
{
    //清理
}

○ 如果没有异常发生,就直接到finally语句块中。
○ finally语句块是必须执行的
○ 这里的catch和finally语句块是可选的。try语句块后面可以跟1个或多个catch语句块,try语句块后面可以直接跟finally语句块。
○ Exception是所有异常的基类

□ 使用.NET默认异常处理机制捕获异常

    class Program
    {
        static void Main(string[] args)
        {
            int a = 0;
            int result = 100/a;
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }

□ 使用try...catch手动捕获异常

    class Program
    {
        static void Main(string[] args)
        {
            int a = 0;
            int result = 0;
            try
            {
                result = 100/a;
                Console.WriteLine("这里不会执行");
            }
            catch (DivideByZeroException exception)
            {
                Console.WriteLine("出现异常");
            }

            Console.WriteLine(result);
            Console.ReadKey();
        }
    }

□ 使用try...catch...finally手动捕获异常

   class Program
    {
        static void Main(string[] args)
        {
            int a = 0;
            int result = 0;
            try
            {
                result = 100/a;
                Console.WriteLine("这里不会执行");
            }
            catch (DivideByZeroException exception)
            {
                Console.WriteLine("出现异常");
            }
            finally
            {
                Console.WriteLine("放行吧,肯定会执行到我这里的~~");
            }

            Console.WriteLine(result);
            Console.ReadKey();
        }
    }


可见,finally语句块中的内容一定会被执行。

□ 使用try...多个catch...finally手动捕获异常

    class Program
    {
        static void Main(string[] args)
        {
            int a = 0;
            int result = 0;
            try
            {
                result = 100/a;
                Console.WriteLine("这里不会执行");
            }
            catch (DivideByZeroException exception)
            {
                Console.WriteLine("不能被0除的异常");
            }
            catch (Exception ex)
            {
                Console.WriteLine("异常");
            }
            finally
            {
                Console.WriteLine("放行吧,肯定会执行到我这里的~~");
            }

            Console.WriteLine(result);
            Console.ReadKey();
        }
    }


可见,只要有一个catch语句块捕获到异常,其它catch语句块不执行。

□ 使用try...catch(不带括号,不带参数)手动捕获异常

    class Program
    {
        static void Main(string[] args)
        {
            int a = 0;
            int result = 0;
            try
            {
                result = 100/a;
                Console.WriteLine("这里不会执行");
            }
            catch
            {
                Console.WriteLine("异常");
            }


            Console.WriteLine(result);
            Console.ReadKey();
        }
    }

通过以上方法,可以捕获任何异常。

□ try...catch手动捕获抛出的异常

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                throw new DivideByZeroException("除数不能为零");
            }
            catch (DivideByZeroException e)
            {
                Console.WriteLine("异常");
            }

            Console.WriteLine("最后想说的");
            Console.ReadKey();
        }
    }

抛出异常本身并没有显示。

□ 较高层次上下文捕获较低抛出的异常

   class Program
    {
        static void Main(string[] args)
        {
            Calculate c = new Calculate();
            try
            {
                c.Divide();
            }
            catch (Exception e)
            {
                Console.WriteLine("捕获异常");
            }

            Console.WriteLine("最后想说的");
            Console.ReadKey();
        }
    }

    public class Calculate
    {
        public void Divide()
        {
            try
            {
                int a = 0;
                int result = 100/a;
            }
            catch (DivideByZeroException e)
            {
                throw;
            }
        }
    }


在Calculate内部抛出的异常,被更高层次的客户端捕获。

□ 自定义异常

   class Program
    {
        static void Main(string[] args)
        {
            try
            {
                throw new MyException("i am exception");
            }
            catch (Exception e)
            {
                Console.WriteLine("捕获到自定义异常了~~");
            }

            Console.WriteLine("最后想说的");
            Console.ReadKey();
        }
    }

    public class MyException : Exception
    {
        public MyException(string str)
        {
            Console.WriteLine("这是我自定义的异常:" + str);
        }
    }


总结:
○ .NET异常处理并不是标准的try...catch...finally,可以是很灵活的。
○ 尽量在较低层次抛异常,在较高层次捕获异常。

C#各种异常处理方式的更多相关文章

  1. Java_IO异常处理方式_入门小笔记

    package IO; import java.io.FileWriter; import java.io.IOException; /** * IO异常处理方式 */ class FileWrite ...

  2. SpringBoot学习15:springboot异常处理方式5(通过实现HandlerExceptionResolver类)

    修改异常处理方式4中的全局异常处理controller package com.bjsxt.exception; import org.springframework.context.annotati ...

  3. SpringMVC 三种异常处理方式

    SpringMVC 三种异常处理方式 在 SpringMVC, SpringBoot 处理 web 请求时, 若遇到错误或者异常,返回给用户一个良好的错误信息比 Whitelabel Error Pa ...

  4. SpringBoot: 15.异常处理方式5(通过实现HandlerExceptionResolver类)(转)

    修改异常处理方式4中的全局异常处理controller package com.bjsxt.exception; import org.springframework.context.annotati ...

  5. JAVA异常及其异常处理方式

    异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用Syste ...

  6. JDK线程池异常处理方式

    1. 抛出异常 execute() java.util.concurrent.ThreadPoolExecutor#runWorker 中抛出,抛出之后经过以下两个步骤: catch块捕获,捕获之后再 ...

  7. 一文带你掌握Spring Web异常处理方式

    一.前言 大家好,我是 去哪里吃鱼 ,也叫小张. 最近从单位离职了,离开了五年多来朝朝夕夕皆灯火辉煌的某网,激情也好悲凉也罢,觥筹场上屡屡物是人非,调转过事业部以为能换种情绪,岂料和下了周五的班的前同 ...

  8. SpringBoot系列: Spring支持的异常处理方式

    ===================================视图函数返回 status code 的方式===================================Spring 有 ...

  9. SpringMVC异常处理方式

    一.描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合 ...

  10. Spring中的统一异常处理方式

    源自:https://segmentfault.com/a/1190000016236188 在具体的SSM项目开发中,由于Controller层为处于请求处理的最顶层,再往上就是框架代码的. 因此, ...

随机推荐

  1. WiFi无线连接真机进行Appium自动化测试方法

    有时需要测试APP 产品的耗电问题,但用自动化又面临了一个USB接电脑供电的问题,从而导致计算出来的功耗与手动跑,存在有很大的误差,因此可使用wifi无线连接到手机进行自动化测试,解决功耗问题. 前提 ...

  2. 使用Oracle数据库,对某个表频繁更新

    使用Oracle数据库,对某个表频繁更新,查询时要联合这张表,查询速度非常慢,有什么解决办法? 一般的pc机oracle更新的效率均可达到500+/s, 可能的问题,你更新这个不会是每次都新建jdbc ...

  3. #JS 异步处理机制的几种方式

    Javascript语言的执行环境是"单线程"(single thread,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推) ...

  4. JavaScript闭包与变量的经典问题

    许多人第一次接触闭包大概都是从高程里这段代码开始的: function createFunctions() { var result = new Array(); for(var i=0; i< ...

  5. Spark(七)Spark内存调优

    一.概述 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文 ...

  6. C语言:凯撒密码的实现

    凯撒密码的实现(10分)题目内容: 凯撒密码(caeser)是罗马扩张时期朱利斯?凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令.它将字母表中的字母移动一定位置而实现加密. ...

  7. Django实战(5):引入bootstrap,设置静态资源

    之前生成了Product类的scaffold,但是如同rails的开发者David所讲的那样,scaffold几乎没什么用.所以按照<Agile Web Development with Rai ...

  8. jdk与eclipse不匹配的各种问题。。。

  9. win7 fiddler报“Creation of the root certificate was not successful”的问题

    cd "C:\Program Files (x86)\Fiddler2" makecert.exe -r -ss my -n "CN=DO_NOT_TRUST_Fiddl ...

  10. [ 转载 ] js十大排序算法:冒泡排序

    js十大排序算法:冒泡排序  http://www.cnblogs.com/beli/p/6297741.html