C#异常处理中try和catch语句及finally语句的用法示例

作者:goldensun 时间:2022-05-27 12:20:43 

使用 try/catch 处理异常
try-catch 块的用途是捕捉和处理工作代码所生成的异常。 有些异常可以在 catch 块中处理,解决问题后不会再次引发异常;但更多情况下,您唯一能做的是确保引发适当的异常。
示例
在此示例中,IndexOutOfRangeException 不是最适当的异常:对本方法而言 ArgumentOutOfRangeException 更恰当些,因为错误是由调用方传入的 index 参数导致的。


class TestTryCatch
{
 static int GetInt(int[] array, int index)
 {
   try
   {
     return array[index];
   }
   catch (System.IndexOutOfRangeException e) // CS0168
   {
     System.Console.WriteLine(e.Message);
     // Set IndexOutOfRangeException to the new exception's InnerException.
     throw new System.ArgumentOutOfRangeException("index parameter is out of range.", e);
   }
 }
}


注释
导致异常的代码被括在 try 块中。 在其后面紧接着添加一个 catch 语句,以便在 IndexOutOfRangeException 发生时对其进行处理。 catch 块处理 IndexOutOfRangeException,并引发更适当的 ArgumentOutOfRangeException 异常。 为给调用方提供尽可能多的信息,应考虑将原始异常指定为新异常的 InnerException。 因为 InnerException 属性是只读,所以必须在新异常的构造函数中为其赋值。


使用 finally 执行清理代码
finally 语句的目的是确保即使在引发异常的情况下也能立即进行必要的对象(通常是保存外部资源的对象)清理。此类清理功能的一个示例是在使用后立即对 FileStream 调用 Close,而不是等待公共语言运行时对该对象进行垃圾回收,如下所示:


static void CodeWithoutCleanup()
{
 System.IO.FileStream file = null;
 System.IO.FileInfo fileInfo = new System.IO.FileInfo("C:\\file.txt");

file = fileInfo.OpenWrite();
 file.WriteByte(0xF);

file.Close();
}

为了将上面的代码转换为 try-catch-finally 语句,需要将清理代码与工作代码分开,如下所示。


static void CodeWithCleanup()
{
 System.IO.FileStream file = null;
 System.IO.FileInfo fileInfo = null;

try
 {
   fileInfo = new System.IO.FileInfo("C:\\file.txt");

file = fileInfo.OpenWrite();
   file.WriteByte(0xF);
 }
 catch(System.UnauthorizedAccessException e)
 {
   System.Console.WriteLine(e.Message);
 }
 finally
 {
   if (file != null)
   {
     file.Close();
   }
 }
}

因为在 OpenWrite() 调用前,try 块内随时都有可能发生异常,OpenWrite() 调用本身也有可能失败,所以我们无法保证该文件在我们尝试关闭它时处于打开状态。 finally 块添加了一项检查,以确保在调用 Close 方法前,FileStream 对象不为 null。如果没有 null 检查,finally 块可能引发自身的 NullReferenceException,但是应当尽可能避免在 finally 块中引发异常。
在 finally 块中关闭数据库连接是另一个不错的选择。因为有时候数据库服务器允许的连接数是有限的,所以应尽快关闭数据库连接。在由于引发了异常而无法关闭连接的情况下,使用 finally 块也是比等待垃圾回收更好的一种选择。

标签:C#,异常处理
0
投稿

猜你喜欢

  • unity5.6 导出gradle工程 Android Studio 导入问题及处理方法

    2022-03-12 00:45:25
  • 一文详解Java线程的6种状态与生命周期

    2022-02-08 08:44:30
  • Android Jetpack架构组件Lifecycle详解

    2023-03-04 22:21:01
  • android图库播放幻灯片时按power键灭屏再亮屏显示keyguard

    2023-11-03 04:32:55
  • SpringBoot读取资源目录中JSON文件的方法实例

    2023-04-26 02:00:42
  • C# XML操作类分享

    2022-02-16 03:22:03
  • Java 普通代码块静态代码块执行顺序(实例讲解)

    2022-07-11 05:44:28
  • C#创建WebService接口并连接的全过程

    2023-04-07 07:47:21
  • jdk1.8中的for循环问题记录

    2023-10-16 04:08:34
  • 基于SSM实现学生管理系统

    2023-11-24 18:17:39
  • Android如何给按钮添加点击音效

    2022-06-24 02:05:05
  • Java中Request请求转发详解

    2021-05-25 20:53:42
  • 详解SpringMVC使用MultipartFile实现文件的上传

    2023-03-28 00:48:18
  • Java 重入锁和读写锁的具体使用

    2023-09-10 11:06:54
  • Android MaterialCardView的使用介绍与示例

    2023-06-23 06:31:56
  • Java中i++与++i的区别和使用

    2022-03-20 18:08:18
  • 从Request.Url中获取根网址的简单操作

    2022-04-18 04:44:40
  • C# 鼠标穿透窗体功能的实现方法

    2021-09-26 04:24:38
  • C#预处理器指令的用法实例分析

    2023-03-09 16:21:07
  • c# 遍历 Dictionary的四种方式

    2023-04-17 13:11:10
  • asp之家 软件编程 m.aspxhome.com