什么是异常?也就是在程序运行过程中会出现错误。
那么就可能有人会问,vs中出现错误不是会报错吗?
首先,vs会报错的基本都是语法错误,但是逻辑错误vs并不会提示错误。只要是符合语法,vs在编译之前都会通过。其次,编写程序的过程中,出现错误是难免的,所以我们需要编写的是更加强壮的代码,来预防以及尽可能地避免程序发生错误。
在C#中,常用try-catch-finally来进行异常的处理。try-catch语句结构如下:
try{ …; }
catch (…;) { …;}
finally{ …;}
其中,catch可以有多个catch语句,finally语句可有可无。
try中放置可能会出现错误异常的代码。在catch中放置错误的类型以及假使出现了错误,该如何处理或者什么提示信息,finally中的代码是不管代码出不出现异常都会被执行的。
下面通过一个小实验更好的理解异常处理。
编写如下实验代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _1
{
class Program
{
static void Main(string[] args)
{
int[] a= { 1, 2, 3 };
int m;
try
{
m = a[3];
}
catch
{
Console.WriteLine("变量m出现了数组访问过界的异常,执行了catch中的语句");
}
finally
{
Console.WriteLine("这是finally中的语句");
}
Console.WriteLine("这是try-catch-finally之外的语句");
Console.ReadKey(true);
}
}
}
运行结果如下:
使用try-catch语句之后,由于try中确实发生了异常,所以会执行catch中的异常处理语句,而finally中的语句并不会受到影响。
而假如没有try-catch语句,运行结果如下:
可以发现后面的语句根本不会输出,程序也会被中断。
异常处理练习题:
编写代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _1
{
class Program
{
static void Main(string[] args)
{
float a = 0, b = 0;
label: //定义书签label 方便goto跳转
Console.WriteLine("请输入2个数字:");
try
{
a = Convert.ToInt32(Console.ReadLine());
b = Convert.ToInt32(Console.ReadLine());
}
catch
{
Console.WriteLine("您输入的不属于数字!");
goto label; //如果发生错误就让用户重新输入
}
float sum=a+b;
Console.WriteLine("结果是:"+sum);
Console.ReadKey(true);
}
}
}
程序运行结果如下:
最后,对于finally:什么情况下需要加入finally?
答:比如链接数据库可能会出现异常,但是建立数据库连接通道,这些资源是会占用内存的,如果发现了连接异常,那么后面的关闭资源的代码就不会被执行,那么finally里面就可以放入这些资源关闭的代码。
总而言之,用try-catch语句可以预防错误的发生,增强程序的鲁棒性。