异常是在程序执行期间出现的问题。
C# 中的异常是对程序运行时出现的特殊情况的一种积极的响应,从而达到程序具有更有健壮性,尽量的避免程序中的死机现象。比如尝试除以零,数组超出索引,字符串格式异常等。
异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。
C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。
try:
一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。
catch:
程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
finally:
finally 块用于执行给定的语句,不管异常是否被抛出都会执行。例如,如果您打开一个文件,不管是否出现异常文件都要被关闭。
throw:
当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。
try
{
// 可能引起异常的语句
}
catch( ExceptionName e1 )
{
//关于e1异常的处理
}
catch( ExceptionName e2 )
{
//关于e2异常的处理
}
catch( ExceptionName eN )
{
//关于eN异常的处理
}
finally
{
// 要执行的语句
//一般用来处理关系文件流或者关闭数据库操作
//该模块是统一的出口 如果显示的写出来 那么是必定要执行的
}
以上的catch捕获异常是可以并列存在的,但是需要注意的是,处于上面的异常和下面的最好没有什么关系,或者处于上面的异常是下面的一个子类。否则编译器会报错。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 异常
{
class Program
{
static void Main(string[] args)
{
int num = 0;
string numStr = string.Empty;
try
{
Console.WriteLine("请输入一个整数");
numStr = Console.ReadLine();
num = int.Parse(numStr);
}
catch (OverflowException e)//输入的数据大于int类型的最大值的时候
{
//打印出异常信息
//Console.WriteLine(e.Message + " " + numStr);
//打印异常信息所在的文件及行数
//Console.WriteLine(e.StackTrace);
//类型超出范围的处理办法
num = 1000;
}
catch(FormatException e) //输入的字符串格式错误的时候捕捉
{
//格式化输入异常的处理办法
num = 2000;
}
catch (Exception e) //捕捉咩有考虑到的其他异常
{
Console.WriteLine("其他异常");
//其他异常的处理方案
}
Console.WriteLine("这个数字是:{0}",num);
}
}
}
【注意】
异常处理的核心是try和Catch。这些关键字共同起作用,不能编写没有try的catch。一个try可以关联多个catch子句。
a、 不带参数的catch和catch(Exception)是有区别的
catch(Exception)可以捕获所有以Exception类派生的异常,而不带参数的catch可以捕获所有异常,不管异常是不是从Exception类派生。
b、与catch配套的catch和finally是可选的,但二者必选其一。一个try可对应多个catch,但一个try只能对应一个finally。
c、不论try中是否发生异常,finally中的语句一定会被执行。
finally关键字
1.捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。
2.无论try所指定的程序块中是否抛出例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。(finally语句与switch中的default语句是不同的!)
3.通常在finally语句中可以进行资源的清除工作,如关闭打开的文件、删除临时文件等。
finally和return的关系:
1.当try和catch中有return时,finally仍然会执行;
2.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码如何修改,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
3.finally中不可以有return,否则语法错误
参考代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 异常处理的执行顺序
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Test());
}
static int Test()
{
int number = 1000;
try
{
int num1 = 100;
int num2 = 1;
number = 2000;
Console.WriteLine("number="+number);
return number;
}
catch (Exception)
{
Console.WriteLine("异常发生了");
number = 3000;
Console.WriteLine("number=" + number);
}
finally
{
Console.WriteLine("finally");
//finally 一般是用来关闭数据库 或者 文件流等操作
number = 4000;
Console.WriteLine("number=" + number);
}
return number;
}
}
}