C#异常捕捉处理

来源:互联网 发布:程序员没前途 编辑:程序博客网 时间:2024/06/05 01:51


try...catch...finally异常捕捉处理


1.异常捕捉处理

try{//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行;否则不会执行catch里面的内容;finally肯定会执行;如果有一行代码发生了异常,那么try块中剩余的代码就不会执行了} catch{//除非try里面执行代码发生了异常,否则这里的代码不会执行;如果catch块的参数不写,表示发生任何异常都执行这个catch块} finally{//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally  }
注意:

1/ 不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally;

但是若try catch里执行了return,finally执行以后就真的return了,不会再走try catch finally外下面的代码。

2/ 其中catch块可以有0或者多个,finally可以有0或者1个
但是如果没有catch块,必须有finally块,没有finally块,必须有catch块,catch块和finally块可以同时存在。

如:

1/ 不加return

 class Program {        static void Main(string[] args) {            try            {                int[] myArray = {1, 2, 3, 4};                Console.WriteLine("这里是try里面执行的代码");                int myEle = myArray[4];            }                          catch//当我们不写catch的参数的时候,那么这个catch会捕捉出现的任何异常信息            {                Console.WriteLine("您访问数组的时候,下标越界了");            }            finally            {                Console.WriteLine("这里是finally里面执行的代码");            }            Console.WriteLine("test");            Console.ReadKey();        }    }
结果:

这里是try里面执行的代码您访问数组的时候,下标越界了这里是finally里面执行的代码test
2/ 加了return

 class Program {        static void Main(string[] args) {            try            {                int[] myArray = {1, 2, 3, 4};                Console.WriteLine("这里是try里面执行的代码");                return;                int myEle = myArray[4];            }                          catch//当我们不写catch的参数的时候,那么这个catch会捕捉出现的任何异常信息            {                Console.WriteLine("您访问数组的时候,下标越界了");            }            finally            {                Console.WriteLine("这里是finally里面执行的代码");            }            Console.WriteLine("test");            Console.ReadKey();        }    }
结果:

这里是try里面执行的代码这里是finally里面执行的代码


所以:


不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally;

但是若try catch里执行了return,finally执行以后就真的return了,不会再走try catch finally外下面的代码。


2.异常类型


可以使用异常语句catch( Exception ex)获取异常,然后通过ex.GetType()得到异常的类型,代码如下所示:

try{    int b = 0;    int a = 100 / b;}catch( Exception ex){   Console.WriteLine("错误类型:"+ex.GetType().ToString());}


常见具体的异常对象:
    ArgumentNullException 一个空参数传递给方法,该方法不能接受该参数   ArgumentOutOfRangeException 参数值超出范围   ArithmeticException 出现算术上溢或者下溢   ArrayTypeMismatchException 试图在数组中存储错误类型的对象   BadImageFormatException 图形的格式错误   DivideByZeroException 除零异常   DllNotFoundException 找不到引用的DLL   FormatException 参数格式错误   IndexOutOfRangeException 数组索引超出范围   InvalidCastException 使用无效的类   InvalidOperationException 方法的调用时间错误   NotSupportedException 调用的方法在类中没有实现   NullReferenceException 试图使用一个未分配的引用   OutOfMemoryException 内存空间不够   StackOverflowException 堆栈溢出

e.g. 有时候异常捕捉有些妙用,如demo from siki:

class Program {        static void Main(string[] args)        {            int num1 = 0, num2 = 0;            Console.WriteLine("请输入第一个数字");            while (true)            {                try {                    num1 = Convert.ToInt32(Console.ReadLine());//在try块中,如果有一行代码发生了异常,那么try块中剩余的代码就不会执行了                    break;                } catch {                    Console.WriteLine("您输入的不是一个整数,请重新输入");                }                //break;//把break放在这里的话,不管发布发生异常都会执行,因为try对异常进行了处理            }            Console.WriteLine("请输入第二个数字");            while (true)            {                try {                    num2 = Convert.ToInt32(Console.ReadLine());//在try块中,如果有一行代码发生了异常,那么try块中剩余的代码就不会执行了                    break;                } catch {                    Console.WriteLine("您输入的不是一个整数,请重新输入");                }                //break;//把break放在这里的话,不管发布发生异常都会执行,因为try对异常进行了处理            }            int sum = num1 + num2;            Console.WriteLine(sum);            Console.ReadKey();        }
要求用户输入两个数字求和,用户输入不是数字则发生异常,则捕捉到了于是提示不是整数需要重输入;输入是数字则不会发生异常break跳出循环。有点妙。

原创粉丝点击