C#异常捕捉处理


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跳出循环。有点妙。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值