杂谈异常处理try-catch-finally

PCB布局布线要求及多层电路板叠加原则 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考本文主要针对PCB布局布线中的要点进行了总结,并对多层电路板的叠加原则进行了解释。 阅读详情

http://www.cnblogs.com/cntosoft/archive/2012/09/06/2673708.html

1.   前言

最近这段时间正开发一个店铺管理系统,这个项目定位于给中小型店铺使用的软件系统。简单的说,它处理商品的进货,销售,退货等功能。软件虽小,五脏俱全,里面涉及的技术跟大型应用软件其实差别也不大,其中有加密、数据访问、异常处理、日志、验证、ORM、依赖注入等。

本篇文章主要介绍C#语言的异常处理方面的内容,其中包含的主要内容:

  • 什么是异常?异常的特点?
  • 异常处理的基础知识。
  • 引发和捕捉异常的处理准则。
  • 避免与异常相关的性能问题的两种设计模式。
  • 微软企业库异常处理模块。

 

2.   异常概述

  • 在应用程序遇到异常情况(如被零除情况或内存不足警告)时,就会产生异常。
  • 在可能引发异常的语句周围使用 try 块。
  • try 块中发生异常后,控制流会立即跳转到关联的异常处理程序(如果存在)。
  • 如果给定异常没有异常处理程序,则程序将停止执行,并显示一条错误消息。
  • 如果 catch 块定义了一个异常变量,则可以使用它来获取有关所发生异常的类型的更多信息。
  • 可能导致异常的操作通过 try 关键字来执行。
  • 异常处理程序是在异常发生时执行的代码块。在 C# 中,catch 关键字用于定义异常处理程序。
  • 程序可以使用 throw 关键字显式地引发异常。
  • 异常对象包含有关错误的详细信息,比如调用堆栈的状态以及有关错误的文本说明。
  • 即使引发了异常,finally 块中的代码也会执行,从而使程序可以释放资源。

 

3.   异常处理基础知识

3.1.  如何:使用 Try/Catch 块捕捉异常

将可能引发异常的代码节放在 Try 块中,而将处理异常的代码放在 Catch 块中。Catch 块是一系列以关键字 catch 开头的语句,语句后跟异常类型和要执行的操作。

下面的代码示例使用 Try/Catch 块捕捉可能的异常。Main 方法包含带有 StreamReader 语句的 Try 块,该语句打开名为 data.txt 的数据文件并从该文件写入字符串。Try 块后面是 Catch 块,该块捕捉 Try 块产生的任何异常。

 

using System;

using System.IO;

using System.Security.Permissions;

// Security permission request.

[assembly:FileIOPermissionAttribute(SecurityAction.RequestMinimum, All = @"c:\data.txt")]

public class ProcessFile {

    public static void Main() {

        try {

            StreamReader sr = File.OpenText("data.txt");

            Console.WriteLine("The first line of this file is {0}", sr.ReadLine());   

        }

        catch(Exception e) {

            Console.WriteLine("An error occurred: '{0}'", e);

        }

    }

}

 

3.2.  如何:在 Catch 块中使用特定异常

发生异常时,异常沿堆栈向上传递,每个 Catch 块都有机会处理它。Catch 语句的顺序很重要。将针对特定异常的 Catch 块放在常规异常 Catch 块的前面,否则编译器可能会发出错误。确定正确 Catch 块的方法是将异常的类型与 Catch 块中指定的异常名称进行匹配。如果没有特定的 Catch 块,则由可能存在的常规 Catch 块捕捉异常。

 

下面的代码示例使用 try/catch 块捕获 InvalidCastException。该示例创建一个名为 Employee 的类,它带有一个属性:职员级别 (Emlevel)。PromoteEmployee 方法取得对象并增加职员级别。将 DateTime 实例传递给 PromoteEmployee 方法时,发生 InvalidCastException。

 

using System;

public class Employee

{

   //Create employee level property.

   public int Emlevel

   {

      get

         {

         return(emlevel);

         }

      set

         {

         emlevel = value;

         }

   }

   int emlevel;

}

public class Ex13

{

   public static void PromoteEmployee(Object emp)

   {

   //Cast object to Employee.

   Employee e = (Employee) emp;

   // Increment employee level.

   e.Emlevel = e.Emlevel + 1;

   }

 

   public static void Main()

   {

   try

      {

   Object o = new Employee();

   DateTime newyears = new DateTime(2001, 1, 1);

   //Promote the new employee.

   PromoteEmployee(o);

   //Promote DateTime; results in InvalidCastException as newyears is not an employee instance.

   PromoteEmployee(newyears);

      }

   catch (InvalidCastException e)

      {

      Console.WriteLine("Error passing data to PromoteEmployee method. " + e);

      }

   }

}

 

3.3.  如何:显式引发异常

可以使用 throw 语句显式引发异常。还可以使用 throw 语句再次引发捕获的异常。较好的编码做法是,向再次引发的异常添加信息以在调试时提供更多信息。

 

下面的代码示例使用 try/catch 块捕获可能的 FileNotFoundException。try 块后面是 catch 块,catch 块捕获 FileNotFoundException,如果找不到数据文件,则向控制台写入消息。下一条语句是 throw 语句,该语句引发新的 FileNotFoundException 并向该异常添加文本信息。

 

using System;

using System.IO;

 

public class ProcessFile

{

   public static void Main()

      {

      FileStream fs = null;

      try  

      {

         //Opens a text tile.

         fs = new FileStream(@"C:\temp\data.txt", FileMode.Open);

         StreamReader sr = new StreamReader(fs);

         string line;

 

         //A value is read from the file and output to the console.

         line = sr.ReadLine();

         Console.WriteLine(line);

      }

      catch(FileNotFoundException e)

      {

         Console.WriteLine("[Data File Missing] {0}", e);

         throw new FileNotFoundException(@"data.txt not in c:\temp directory]",e);

      }

      finally

      {

         if (fs != null)

            fs.Close();

      }

   }

}

 

3.4.  如何:使用 Finally 块

异常发生时,执行将终止,并且控制交给最近的异常处理程序。这通常意味着不执行希望总是调用的代码行。有些资源清理(如关闭文件)必须总是执行,即使有异常发生。为实现这一点,可以使用 Finally 块。Finally 块总是执行,不论是否有异常发生。

 

下面的代码示例使用 try/catch 块捕获 ArgumentOutOfRangeException。Main 方法创建两个数组并试图将一个数组复制到另一个数组。该操作生成 ArgumentOutOfRangeException,同时错误被写入控制台。Finally 块执行,不论复制操作的结果如何。

using System;

class ArgumentOutOfRangeExample

{

         static public void Main()

  {

  int[] array1={0,0};

  int[] array2={0,0};

     try

     {

     Array.Copy(array1,array2,-1);

     }

     catch (ArgumentOutOfRangeException e)

     {

     Console.WriteLine("Error: {0}",e);

     }

     finally

     {

     Console.WriteLine("This statement is always executed.");

     }

  }

}

 

4.   异常设计准则

4.1.  异常引发

  • 不要返回错误代码。异常是报告框架中的错误的主要手段。
  • 尽可能不对正常控制流使用异常。除了系统故障及可能导致争用状态的操作之外,框架设计人员还应设计一些 API 以便用户可以编写不引发异常的代码。例如,可以提供一种在调用成员之前检查前提条件的方法,以便用户可以编写不引发异常的代码。
  • 不要包含可以根据某一选项引发或不引发异常的公共成员。
  • 不要包含将异常作为返回值或输出参数返回的公共成员。
  • 考虑使用异常生成器方法。从不同的位置引发同一异常会经常发生。为了避免代码膨胀,请使用帮助器方法创建异常并初始化其属性。
  • 避免从 finally 块中显式引发异常。可以接受因调用引发异常的方法而隐式引发的异常。

 

4.2.  异常处理

  • 不要通过在框架代码中捕捉非特定异常(如 System.Exception、System.SystemException 等)来处理错误。
  • 避免通过在应用程序代码中捕捉非特定异常(如 System.Exception、System.SystemException 等)来处理错误。某些情况下,可以在应用程序中处理错误,但这种情况极。
  • 如果捕捉异常是为了传输异常,则不要排除任何特殊异常。
  • 如果了解特定异常在给定上下文中引发的条件,请考虑捕捉这些异常。
  • 不要过多使用 catch。通常应允许异常在调用堆栈中往上传播。
  • 使用 try-finally 并避免将 try-catch 用于清理代码。在书写规范的异常代码中,try-finally 远比 try-catch 更为常用。
  • 捕捉并再次引发异常时,首选使用空引发。这是保留异常调用堆栈的最佳方式。
  • 不要使用无参数 catch 块来处理不符合 CLS 的异常(不是从 System.Exception 派生的异常)。支持不是从 Exception 派生的异常的语言可以处理这些不符合 CLS 的异常。

 

5.   两种设计模式

5.1.  Tester-Doer 模式

Doer 部分

public class Doer

{

    public static void ProcessMessage(string message)

    {

        if (message == null)

        {

            throw new ArgumentNullException("message");

        }

    }

}

 

Tester部分

public class Tester

{

    public static void TesterDoer(ICollection<string> messages)

    {

        foreach (string message in messages)

        {

            if (message != null)

            {

                Doer.ProcessMessage(message);

            }

        }

    }

}

 

5.2.  TryParse 模式

TryParse 方法类似于 Parse 方法,不同之处在于 TryParse 方法在转换失败时不引发异常。

Parse方法

public void Do()

{

    string s = “a”;

    double d;

    try

    {

        d = Double.Parse(s);

    }

    catch (Exception ex)

    {

        d = 0;

    }

}

 

TryParse方法

public void TryDo()

{

    string s = "a";

    double d;

    if (double.TryParse(s, out d) == false)

    {

        d = 0;

    }

}

 

6.   微软企业库异常处理模块

6.1.  创建自定义异常包装类

public class BusinessLayerException : ApplicationException

{

     public BusinessLayerException() : base()

     {

     }

 

     public BusinessLayerException(string message) : base(message)

     {

     }

    

     public BusinessLayerException(string message, Exception exception) :

         base(message, exception)

     {

     }

 

     protected BusinessLayerException(SerializationInfo info, StreamingContext context) :

         base(info, context)

     {

     }

}

 

6.2.  配置异常处理

<add name="Wrap Policy">

        <exceptionTypes>

          <add type="System.Data.DBConcurrencyException, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

            postHandlingAction="ThrowNewException" name="DBConcurrencyException">

            <exceptionHandlers>

              <add exceptionMessage="Wrapped Exception: A recoverable error occurred while attempting to access the database."

                exceptionMessageResourceType="" wrapExceptionType="ExceptionHandlingQuickStart.BusinessLayer.BusinessLayerException, ExceptionHandlingQuickStart.BusinessLayer"

                type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WrapHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

                name="Wrap Handler" />

            </exceptionHandlers>

          </add>

        </exceptionTypes>

      </add>

 

6.3.  编写代码

public bool ProcessWithWrap()

{

    try

    {

         this.ProcessB();

    }

    catch(Exception ex)

    {

         // Quick Start is configured so that the Wrap Policy will

         // log the exception and then recommend a rethrow.

         bool rethrow = ExceptionPolicy.HandleException(ex, "Wrap Policy");

 

         if (rethrow)

         {

             throw;            

         }             

    }

 

    return true;

}

 

6.4.  参考

SocraticLM: Exploring Socratic Personalized Teaching with Large Language Models 大型语言模型(LLM)被认为是推进智能教育的一项关键技术,因为它们展示了深入理解教学场景和为学生提供个性化指导的潜力。然而,当前个性化教学中基于LLM的应用主要遵循“问答”范式,学生被动地获得答案和解释。在本文中,我们提出了苏格拉底式教学模式(SocraticLM ),它实现了一种苏格拉底式的“发人深省”的教学范式,实现了真正的课堂教师的角色,让学生积极参与到真正掌握解决问题所需的思考过程中。 阅读详情

相关推荐

Ghidra逆向分析实战:从安装JDK到解析STM32的bin文件(附SVD插件配置)

本文详细介绍了使用Ghidra进行STM32固件逆向分析的完整流程,从JDK安装配置到SVD插件的应用。通过实战案例展示如何解析bin文件、恢复符号信息以及利用SVD插件识别外设寄存器,帮助开发者高效完成嵌入式设备的逆向工程任务。

weixin_29309475的博客 644

异常(try、catch、finally)

异常(try、catch、finally)

xiaozhou的博客 1402

学习记录(十一)--Pattern Recognition投稿记录

上一周特别忽然通知统计建模要答辩,确定是否晋级国赛,一直在准备答辩的事情,所以上一周没有总结周汇报,深刻检讨!!!不过结果是好的,我们组第二名晋级哦。这周主要是跟大家分享一下我投稿PR(Pattern Recognition)的一个时间线,以及投稿后的工作。一、PR从投稿到接收的时间线2025.4.3 Major Revision(ddl4.23) 当时正在弄比赛和另一个着急推进的文章2025.5.30 Minor Revision 这次小修基本上只有一些格式和简单一点点问题。

qq_54949944的博客 1918

Java异常处理机制 try-catch-finally

Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享。一、在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有错,并且提供修改方法。很多情况下,当我们调用某个方法时,会提示我们某条语句应该用 try-catch语句来包起来。 但是一直没有去理解这是为什么!!! 举例说明如下:ExceptionDe...

weixin_33851604的博客 1121

避坑指南:RFSoC数据转换器多片同步配置的7个致命错误

本文深入剖析了在配置RFSoC多片同步功能时,工程师最常遇到的七个致命错误。从Tile 0的强制启用、时钟域与SYSREF时序,到跨代器件兼容性、电源序列以及动态重配置的陷阱,文章结合实战经验,提供了从原理到调试的完整RF数据转换器配置指南,旨在帮助开发者高效构建相位一致的大规模射频采样系统。

weixin_28452161的博客 533

使用Qt Creator调用eBUS SDK

在新界面,勾选左下角“ Show unreachable Network Devices",可以看到没有成功连接的网络相机,原因是IP地址配置错误。每个版本的OpenCV的依赖项的名字都不同,我这里是opencv_world490.lib与opencv_world490d.lib。函数,可以看到在这里是图像缓存区,能够对捕获的图像进行一些操作。在Visual Studio打开项目属性,在VC++目录这里,把Opencv的路径添加进去。这时,会自动跳转到mainwindow.cpp,生成该按钮对应的槽函数。

qq_35685051的博客 1288

try-finally与try-catch-finally的…

为了弄清楚try-finally及try-catch-finally的使用和执行流程,进行了如下实验,先分享给网友们,不对的地方指正批评哈!!! 实验方法:根据try所在的函数是否带返回值、return所在的位置和是否抛出异常三种情况进行分析 源码: 代码都有注释,要注意的是"return"和"return XXX"使用了同一个标识,如都用D 实验结果: 1.try-catch-fin

飞鸽传说的博客 1497

fastadmin云快充充电桩系统部署文档uniapp

多商户 嘎嘎快充V1.0部署文档 一、服务器环境: 服务器配置4核心8GB内存5M带宽以上配置 VX next1402 只支持linux环境 nginx1.22 php7.2 开启redis、fileinfo扩展,关闭禁用workerman gatewayworkerman需要的函数,如pcntl相关的函数 mysql5.7 supervisor redis 注意: 1.站点必须配置https、websocket配置wss 2.注意开放直连服务端口:2024,并添加到安全组 二、必

itholiday2014的博客 1629

try-catch-finally异常处理(一)

java异常处理的方式有两种 1.捕捉异常 2.转移异常 这里先说捕捉异常(对于一个系统而言,异常处理是非常关键的,处理得好能够避免和减少系统bug,同时也能够非常好的定位问题来源) 捕捉异常都是通过try-catch-finally结构处理,一般有两种格式 如下所示: //结构2 try { //可能会产生异常的语句 } catch (Excepti

荣子 1825

从 PI Start Page 到 ESR、ID、SLD,重新理解 SAP PI 的工具访问体系

摘要 SAP PI工具入口设计反映了系统核心分工逻辑。不同角色通过特定入口访问专属工具:集成顾问使用Enterprise Services Builder设计接口,BASIS管理员通过SAP NetWeaver Administrator监控运行状态,技术顾问在Integration Builder配置路由,系统维护则需进入System Landscape Directory。这种设计体现了PI平台将工作划分为管理、技术配置、设计、业务配置和监控五大领域。尤其值得注意的是技术配置与业务配置的连续性关系,如I

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1870

华为OD机试双机位C卷-几何平均值最大子数组(Py/Java/C/C++/Js/Go)

华为OD机试(机考)2026双机位C卷 【几何平均值最大子数组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【几何平均值最大子数组】。

qq_45776114的博客 1367

[转]:杂谈异常处理try-catch-finally

原文地址:http://www.cnblogs.com/cntosoft/archive/2012/09/06/2673708.html 1. 前言 最近这段时间正开发一个店铺管理系统,这个项目定位于给中小型店铺使用的软件系统。简单的说,它处理商品的进货,销售,退货等功能。软件虽小,五脏俱全,里面涉及的技术跟大型应用软件其实差别也不大,其中有加密、数据访问、异常处理、日志、验证、...

angxiong8650的博客 223

ican项目四汽车零件智能测量

ican项目四汽车零件智能测量

weixin_72050316的博客 561

java中try 与catch的使用

(2011-10-08 17:08:43) 转载▼ 标签: 杂谈 分类:Java try{//代码区}catch(Exception e){//异常处理}代码区如果有错误,就会返回所写异常的处理。 首先要清楚,如果没有try的话,出现异常会导致程序崩溃。而try则可以保证程序的正常运行下去,比如说:try{int i =...

weixin_33730836的博客 135

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

再谈异常处理try-catch-finally

1. 查找系统中坏味道的异常处理代码 在上篇文章杂谈异常处理try-catch-finally中主要详细介绍了C#异常处理的概念,异常设计准则,基础知识等方面的内容,但对如何正确使用异常处理印象还不是特别深刻吧。在这篇中,我通过查找以前系统代码中存在坏味道的异常处理代码来分析和讲解如何正确使用异常处理。 1.1. 例一 /// <summary> /// 保存记录 ...

weixin_30883311的博客 137

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【总结】杂谈Java异常处理

软件开发中一个古老的说法是:80%的工作使用20%的时间。80%是指检查和处理错误所付出的努力。在许多语言中,编写检查和处理错误的程序代码很乏味,并使应用程序代码变得冗长。原因之一就是它们的错误处理方式不是语言的一部分。尽管如此,错误检测和处理仍然是任何健壮应用程序最重要的组成部分。   Java 提供了一种很好的机制,用强制规定的形式来消除错误处理过程中随心所欲的因素:异常处理。它的优秀之处...

ccnunlp的专栏 167

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

杂谈Java异常处理

      软件开发中一个古老的说法是:80%的工作使用20%的时间。80%是指检查和处理错误所付出的努力。在许多语言中,编写检查和处理错误的程序代码很乏味,并使应用程序代码变得冗长。原因之一就是它们的错误处理方式不是语言的一部分。尽管如此,错误检测和处理仍然是任何健壮应用程序最重要的组成部分。       Java 提供了一种很好的机制,用强制规定的形式来消除错误处理过程中随心所欲的因素:...

yde986的专栏 166

java 调用失败后重新调用_java 调用失败重试2次 Java异常结构

异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架,是Java语言健壮性的一个重要体现。Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。Java异常体系结构呈树状,其层次如图所示:Thorwab...

weixin_39965881的博客 1887

java类与对象

继承:extends ,子类继承父类的方法,super,例如:super.name()可以访问父类,super()必须在第一行用以调用父类构造方法。当子类重写了父类方法时会调用子类方法,简单来说就是父类可以指向子类,但是不能调用子类独有的方法。多态(方法多态 ): 可以指向的引用类型不确定了,父类的引用指向子类;继承抽象类的子类必须实现抽象类的所有方法,不能new,只能由子类完成。强制转换类型用()由高转低,从而可以调用子类方法(向下转化)接口(本质上是契约)只有规范,自身无法写方法,约束和实现分离。

JJ的记录~ 407

杂谈——Java中throws和throw的区别

之前本帅博主写过一篇关于try-catch和finally的文章,即try-catch与finally语句块中使用return的注意事项以及相关引申,这篇文章讲述了一些它们之间的注意事项。 这try-catch语句块中,还有很重要的一点,就是异常。 对于异常,我们从来都不陌生。可以说,自从我们第一次写代码到现在的第n次写代码,异常从未离我们远去,甚至随着我们学习面的逐渐旷阔而变得越发的频繁与复...

Searchin_R的博客 2128

Java编程思想 -- 异常

杂谈人们在使用软件时,遇到程序错误会很不爽。如果一个用户在运行期间,由于程序的错误或一些外部环境的影响造成用户数据的丢失,用户就有可能不在使用这个程序了。为了必选这类事情的发生,至少应该做到以下几点: 向用户通告错误 返回到一种安全的状态,并能够让用户自行一些其他的命令 允许用户保存所有的操作的结果,并以妥善的方式终止程序。 程序需要关心的错误种类 用户输入错误 除了不可避免的键盘输入错误,有些用

qq576341837的博客 501

使用try-catch-finally处理异常

用法一览 try{ //需要被检测的异常代码 } catch(Exception e){ //异常处理,即处理异常代码 } finally{ //一定会被执行的代码 } 可以在catch部分加上一句打印异常 System.out.println(e.ToString()); try+catch+finally Java通过面向对象的方法来处理异常。 在一个方法的运行过程中,如果发生了异常,则这个方法生成代表该异常的一个对象,并把它交给运行时系统,运行时系统寻找相应代码来处理这一

weixin_42388833的博客 2636
上一篇: try-catch-finally 用法
下一篇: C# 操作 Excel 常见问题收集和整理
leaf_1007
博客等级 码龄15年 17粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值