C#:try catch finally:异常处理

常用的系统异常类如下表所示。

 

异常类说明
System.OutOfMemoryException用 new 分配内存失败
System.StackOverflowException递归过多、过深
System.NullReferenceException对象为空
Syetem.IndexOutOfRangeException数组越界
System.ArithmaticException算术操作异常的基类
System.DivideByZeroException除零错误

 

在 C# 语言中异常与异常处理语句包括三种形式,即 try catch、try finally、try catch finally。

在上述三种异常处理的形式中所用到关键字其含义如下:

  • try:用于检查发生的异常,并帮助发送任何可能的异常。 
  • catch:以控制权更大的方式处理错误,可以有多个 catch 子句。 
  • finally:无论是否引发了异常,finally 的代码块都将被执行。 


下面我们将分别为大家讲解这三种形式的应用。

1) try catch

在 try 语句中放置可能出现异常的语句,而在 catch 语句中放置异常时处理异常的语句,通常在 catch 语句中输出异常信息或者发送邮件给开发人员等。

下面通过实例来演示 try catch 的应用。

另外,在处理异常时,catch 语句是允许多次使用的,相当于多分支的 if 语句,仅能执行其中一个分支。

【实例 1】在文本框中输入一个整数,并判断其是否大于 100。

根据题目要求,如果在文本框中输入的是一个字符串或者浮点数,就会出现类型转换错误,如下图所示。
 

“输入字符串格式不正确”的异常提示


如果使用异常处理的语句来处理数据类型转换,则不会岀现上图中的提示,而是出现 catch 语句中弹出的消息框,实现的代码如下。

 
  1. public partial class tryCatchForm : Form
  2. {
  3. public tryCatchForm()
  4. {
  5. InitializeComponent();
  6. }
  7. //“确认”按钮单击事件
  8. private void button1_Click(object sender, EventArgs e)
  9. {
  10. //获取文本框中的值
  11. string str = textBox1.Text;
  12. //将字符串装换为整数
  13. try
  14. {
  15. int num = int.Parse(str);
  16. MessageBox.Show("您输入的数字是:" + num);
  17. }
  18. catch (Exception ex)
  19. {
  20. MessageBox.Show(ex.Message);
  21. }
  22. }
  23. }

运行该窗体,输入字符串“abc”,并单击“确定”按钮,效果如下图所示。
 

try catch 的应用


从运行效果可以看出,使用异常处理后不会再出现上面所示的异常提示,而是弹出 catch 子句中的消息框。

【实例 2】使用多个 catch 语句对程序做异常处理。

从控制台输入 5 个数存入整数数组中,首先判断输入的值是否为数值,再判断数组元素是否越界。

根据题目要求,创建控制台应用程序完成该实例,具体的代码如下。

 
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //定义存放5个整数的数组
  6. int[] a = new int[5];
  7. try
  8. {
  9. for(int i = 0; i < a.Length; i++)
  10. {
  11. a[i] = int.Parse(Console.ReadLine());
  12. }
  13. for(int i = 0; i < a.Length; i++)
  14. {
  15. Console.Write(a[i] + " ");
  16. }
  17. }
  18. catch(FormatException f)
  19. {
  20. Console.WriteLine("输入的数字格式不正确!");
  21. }
  22. catch(OverflowException o)
  23. {
  24. Console.WriteLine("输入的值已经超出 int 类型的最大值!");
  25. }
  26. catch(IndexOutOfRangeException r)
  27. {
  28. Console.WriteLine("数组越界异常!");
  29. }
  30. }
  31. }

运行该程序,效果如下图所示。
 

多个catch语句处理异常的效果


从运行效果可以看出,捕获该程序产生的异常类是 FormatException。

这样,在出现不同的异常时都会有相应的异常类来处理异常,这也是比较推荐的一种编程方法。

2) try finally

在 try finally 形式中没有单独对出现异常时处理的代码,finally 语句是无论 try 中的语句是否正确执行都会执行的语句。

通常在 finally 中编写的代码是关闭流、关闭数据库连接等操作,以免造成资源的浪费。

下面通过实例来演示 try finally 形式的应用。

【实例 3】验证 finally 语句的使用。

将实例 1 中的 catch 语句换成 finally 语句,代码如下。

 
  1. public partial class tryCatchForm : Form
  2. {
  3. public tryCatchForm()
  4. {
  5. InitializeComponent();
  6. }
  7. //“确认”按钮单击事件
  8. private void button1_Click(object sender, EventArgs e)
  9. {
  10. //获取文本框中的值
  11. string str = textBox1.Text;
  12. //将字符串装换为整数
  13. try
  14. {
  15. int num = int.Parse(str);
  16. MessageBox.Show("您输入的数字是:" + num);
  17. }
  18. finally
  19. {
  20. MessageBox.Show("finally 语句");
  21. }
  22. }
  23. }

运行该窗体,单击“确定”按钮后效果如下图所示。
 

使用try finally


从运行效果可以看出,当文本框中输入的值是一个数字字符串时也会执行 finally 语句中的内容。

【实例 4】从文本框中输入当天的天气情况,并将其写入文件中,无论写入是否成功都将文件流关闭。

根据题目要求,使用 Windows 应用程序完成该实例,界面设计如下图所示。
 

天气信息录入界面


单击“确认”按钮后,将界面的文本框中的信息写入名为 weather.txt 的文本文件中, 代码如下。

 
  1. public partial class TryFinallyForm : Form
  2. {
  3. public TryFinallyForm()
  4. {
  5. InitializeComponent();
  6. }
  7. //"确认"按钮的单击事件
  8. private void button1_Click(object sender, EventArgs e)
  9. {
  10. //获取文本框
  11. string city = txtCity.Text;
  12. string msg = txtMsg.Text;
  13. string min = txtMin.Text;
  14. string max = txtMax.Text;
  15. //将文本框中的内容组成一个字符串
  16. string message = city + ":" + msg + ":" + min + "~" + max;
  17. //定义文件路径
  18. string path = "D:\\C#_test\\weather.txt";
  19. FileStream fileStream = null;
  20. try
  21. {
  22. //创建fileSteam类的对象
  23. fileStream = new FileStream(path, FileMode.OpenOrCreate);
  24. //将字符串转换成字节数组
  25. byte[] bytes = Encoding.UTF8.GetBytes(message);
  26. //向文件中写入字节数组
  27. fileStream.Write(bytes, 0, bytes.Length);
  28. //刷新缓冲区
  29. fileStream.Flush();
  30. //弹出录入成功的消息框
  31. MessageBox.Show("天气信息录入成功!");
  32. }
  33. finally
  34. {
  35. if (fileStream != null)
  36. {
  37. //关闭流
  38. fileStream.Close();
  39. }
  40. }
  41. }
  42. }

运行该窗体,并在界面中填入所需的信息,单击“确认”按钮,效果如下图所示。
 

天气信息的录入操作

3) try catch finally

try catch finally 形式语句是使用最多的一种异常处理语句。

在出现异常时能提供相应的异常处理,并能在 finally 语句中保证资源的回收。

下面通过实例来演示 try catch finally 语句的应用。

【实例 5】使用 try catch finally 形式完成实例 4 的题目要求。

在实例 4 中使用了 try finally 的形式来处理异常,这样在岀现异常时并不会在程序中给予任何提示。

下面使用 try catch finally 的形式来实现,代码如下。

 
  1. public partial class TryFinallyForm : Form
  2. {
  3. public TryFinallyForm()
  4. {
  5. InitializeComponent();
  6. }
  7. //"确认"按钮的单击事件
  8. private void button1_Click(object sender, EventArgs e)
  9. {
  10. //获取文本框
  11. string city = txtCity.Text;
  12. string msg = txtMsg.Text;
  13. string min = txtMin.Text;
  14. string max = txtMax.Text;
  15. //将文本框中的内容组成一个字符串
  16. string message = city + ":" + msg + ":" + min + "~" + max;
  17. //定义文件路径
  18. string path = "D:\\C#_test\\weather.txt";
  19. FileStream fileStream = null;
  20. try
  21. {
  22. //创建fileSteam类的对象
  23. fileStream = new FileStream(path, FileMode.OpenOrCreate);
  24. //将字符串转换成字节数组
  25. byte[] bytes = Encoding.UTF8.GetBytes(message);
  26. //向文件中写入字节数组
  27. fileStream.Write(bytes, 0, bytes.Length);
  28. //刷新缓冲区
  29. fileStream.Flush();
  30. //弹出录入成功的消息框
  31. MessageBox.Show("天气信息录入成功!");
  32. }
  33. catch(Exception ex)
  34. {
  35. MessageBox.Show("出现错误!" + ex.Message);
  36. }
  37. finally
  38. {
  39. if (fileStream != null)
  40. {
  41. //关闭流
  42. fileStream.Close();
  43. }
  44. }
  45. }
  46. }

运行该窗体,效果与实例 4 所示的一样,但是当程序出现错误时会弹出 catch 语句中的提示消息。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小薛1988

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值