全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

学会使用C#异常

在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”。异常通常由错误的代码引发,并由能够更正错误的代码进行 catch。异常可由 .NET 的 CLR 或由程序中的代码引发。一旦引发了异常,这个异常将会在调用堆栈中一直向上进行传播,直到寻找到跟它匹配的 catch 语句。没有 catch 的异常会由系统提供的默认的异常处理程序进行处理,也就是你经常看到的一个突然造成调试中断并显示异常信息的对话框。

所有的异常,它们都是从 Exception 派生出来的。这些异常的类型,都会包含详细描述异常的属性。在这里我将自定义了一个新的异常类,其实也可以自定义配置异常的属性(这是可选的),然后我使用 throw 关键字显示引发该对象(即异常)。

/// <summary>
  /// 定义新异常
  /// </summary>
  class MyException : Exception
  {
   public MyException(string msg) { }
  }
  /// <summary>
  /// 抛出新定义的异常
  /// </summary>
  static void ThrowMyExcetion()
  {
   throw new MyException("Sorry, this is test!");
  }

在引发异常之后,运行时程序会检查当前语句确定它是否包含在 try 块中。 如果是的话,就会检查与该 try 块相关联的所有 catch 块,来确定它们是否能够 catch 该异常。  catch 块通常会指定异常类型;如果该 catch 块的类型与异常或它的基类的相同(或匹配),则该 catch 块就能够捕获并处理。

static void Main(string[] args)
  {
   try
   {
    ThrowMyExcetion(); //直接调用抛出异常的方法
   }
   catch (MyException e)
   {
    Console.WriteLine(e);
   }
   Console.Read();
  }

如果引发异常的语句不在 try 块中,或者包含该语句的 try 块没有匹配的 catch 块,运行时将检查调用方法中是否有 try 语句和 catch 块。 运行时将在调用堆栈中继续往上搜索兼容(或匹配)的 catch 块。在找到并执行 catch 块之后,控制权将传递给 catch 块之后的下一个语句。

一个 try 语句可能包含多个 catch 块。 将执行第一个能够处理该异常的 catch 语句;任何后续的 catch 语句都将被忽略,即使它们是兼容的也如此。 因此,在任何情况下都应该按照从最具体(或者派生程度最高)到最不具体这一顺序排列 catch 块。 例如:

static void Main(string[] args)
  {
   StreamWriter sw = null;
   try
   {
    sw = new StreamWriter(@"C:\book\小二和小三的故事.txt");
    sw.Write("You are 250.");
   }
   catch (FileNotFoundException e)
   {
    //将具体的异常放在第一位
    Console.WriteLine(e);
   }
   catch (IOException e)
   {
    //将并不具体的放在相对后面的位置
    Console.WriteLine(e);
   }
   catch (Exception e)
   {
    Console.WriteLine(e);
   }
   finally
   {
    if (sw != null)
    {
     sw.Close();
    }
   }
   Console.Read();
  }

执行 catch 块之前,运行时会检查 finally 块。 Finally 块使程序员能够清除中止的 try 块可能遗留下的任何模糊状态,或者释放任何外部资源(例如图形句柄、数据库连接或文件流),而无需等待运行时中的垃圾回收器终结这些对象。 例如:

static void Main(string[] args)
  {
   FileStream fs = null;
   FileInfo fi = new FileInfo(@"小二和小三的故事.txt");
   try
   {
    fs = fi.OpenWrite();
    fs.WriteByte(0);
   }
   finally
   {
    //记住哦,如果你忘记 close,将会引发 IO 异常!
    //if (fs != null)
    //{
    // fs.Close();
    //}
   }
   try
   {
    fs = fi.OpenWrite();
    fs.WriteByte(1);
    Console.WriteLine("OK!");
   }
   catch (IOException e)
   {
    Console.WriteLine("Fail!");
   }
   Console.Read();
  }

“Fail!”,这是因为上面注释了需要关闭文件流的语句,你可以尝试下去掉注释看看结果,记住哦,IO 操作都应该在结束时释放资源。 

如果 WriteByte(0)(第9行) 引发了异常,那么在没有调用 fs.Close() 的情况下,你在第二个 try 块中尝试重新 OpenWrit() 的代码就会失败,因为此时文件会保持锁定状态。 假如你取消注释,由于会执行 finally 块(即使已引发异常),使得可以正确地关闭文件,从而避免再次引发异常。

如果在引发异常之后没有在调用堆栈上找到相匹配的 catch 块,则会可能会出现下面的情况:

  • 如果异常出现在析构函数中,则中止该析构函数并调用基类的析构函数(如果有)。
  • 如果调用堆栈包含静态构造函数或静态字段初始值设定项,则会引发 TypeInitializationException,并将原始异常分配给新异常的 InnerException 属性。
  • 如果到达线程的开头,将会终止线程。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# C#  # 异常  # C#解决SQlite并发异常问题的方法(使用读写锁)  # 详解C#编程中异常的创建和引发以及异常处理  # 浅谈C#中简单的异常引发与处理操作  # 解析C#中断言与异常的应用方式及异常处理的流程控制  # 轻松学习C#的异常处理  # C#中抛出异常用法实例  # C# WinForm捕获未处理的异常实例解析  # c#实现把异常写入日志示例(异常日志)  # C#异常处理详解  # 解析c#在未出现异常情况下查看当前调用堆栈的解决方法  # 就会  # 将会  # 自定义  # 则会  # 引发了  # 抛出  # 时将  # 小二  # 小三  # 这是  # 情况下  # 这一  # 如果你  # 在这里  # 放在  # 你可以  # 第一个  # 多个  # 句柄  # 出现在 


相关文章: 建站之星安装后如何自定义网站颜色与字体?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  如何通过虚拟主机快速完成网站搭建?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  c# 在高并发场景下,委托和接口调用的性能对比  利用JavaScript实现拖拽改变元素大小  如何在Golang中使用replace替换模块_指定本地或远程路径  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  如何挑选最适合建站的高性能VPS主机?  定制建站流程步骤详解:一站式方案设计与开发指南  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  如何通过wdcp面板快速创建网站?  建站VPS能否同时实现高效与安全翻墙?  如何在IIS7上新建站点并设置安全权限?  如何获取上海专业网站定制建站电话?  C++如何编写函数模板?(泛型编程入门)  如何零基础开发自助建站系统?完整教程解析  建站主机核心功能解析:服务器选择与网站搭建流程指南  建站之星如何修改网站生成路径?  在线制作视频网站免费,都有哪些好的动漫网站?  Python路径拼接规范_跨平台处理说明【指导】  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  建站之家VIP精选网站模板与SEO优化教程整合指南  宁波免费建站如何选择可靠模板与平台?  如何快速生成专业多端适配建站电话?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  如何快速重置建站主机并恢复默认配置?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  如何确保西部建站助手FTP传输的安全性?  如何注册花生壳免费域名并搭建个人网站?  网站代码制作软件有哪些,如何生成自己网站的代码?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  如何构建满足综合性能需求的优质建站方案?  如何在阿里云香港服务器快速搭建网站?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  郑州企业网站制作公司,郑州招聘网站有哪些?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  如何用西部建站助手快速创建专业网站?  ,有什么在线背英语单词效率比较高的网站?  如何零基础在云服务器搭建WordPress站点?  如何用y主机助手快速搭建网站?  香港服务器如何优化才能显著提升网站加载速度?  建站之星免费版是否永久可用?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  ,巨量百应是干嘛的?  子杰智能建站系统|零代码开发与AI生成SEO优化指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。