首页 > 编程语言 >C# 学习笔记 - 异常

C# 学习笔记 - 异常

时间:2023-07-02 14:44:16浏览次数:63  
标签:sqlConn Console C# 笔记 try finally catch 异常

异常

概述

C# 的异常捕获系统允许开发者将正常代码与异常处理逻辑进行分离。

异常可以表示在软件执行期间出现的各种异常情况,包括内部的和外部的。

外部条件导致的异常:网络故障、权限不足、内存不足、Web服务引发的异常,这些异常通常由操作系统、.NET 运行时或外部应用程序引发;

内部条件导致的异常:软件缺陷、设计的功能故障、传播的外部故障,例如运行时检测到空对象引用、用户输入的无效字符串。

用户自定义的异常类应当继承 Exception 类。

C# 有三种捕获异常的定义:

  • try / catch : 捕获并处理
  • try / catch / finally : 捕获并处理,同时不管是否捕获到异常,始终执行 finally 语句块
  • try / finally : 始终执行 finally 语句块,任何发生的异常都将在 finally 语句块后抛出

异常按照从具体到抽象的顺序被捕获,例如:如果尝试访问一个不存在的文件,CLR 将按照以下顺序查找异常处理器(exception handlers):

  • FileNotFoundException
  • IOException(FileNotFoundException 的基类)
  • SystemException(IOException 的基类)
  • Exception(SystemException 的基类)

如果抛出的异常不是派生自要捕获的异常列表,或者不在要捕获的例外列表中,则会将其抛出调用堆栈。

If the exception being thrown does not derive from or is not in the list of exceptions to catch, it is thrown up the call stack.

举例

try / catch

捕获单个异常:

class ExceptionTest
{
     public static void Main(string[] args)
     {
          try
          {
               Console.WriteLine(args[0]);
               Console.WriteLine(args[1]);
               Console.WriteLine(args[2]);
               Console.WriteLine(args[3]);
               Console.WriteLine(args[4]);
          }
          catch (ArgumentOutOfRangeException e)
          {
               Console.WriteLine(e.Message);
          }
     }
}

捕获多个异常:

class ExceptionTest
{
     public static void Main(string[] args)
     {
          try
          {
               string fileContents = new StreamReader(@"C:\log.txt").ReadToEnd();
          }
          catch (UnauthorizedAccessException e) // Access problems
          {
               Console.WriteLine(e.Message);
          }
          catch (FileNotFoundException e)       // File does not exist
          {
               Console.WriteLine(e.Message);
          }
          catch (IOException e)                // Some other IO problem.
          {
               Console.WriteLine(e.Message);
          }
     }
}

catch 语句中,可以省略异常类型和异常变量名,例如:

try
{
    int number = 1/0;
}
catch (DivideByZeroException)
{
    // DivideByZeroException
}
catch
{
    // some other exception
}

try / catch / finally

using System;
class ExceptionTest
{
     public static void Main(string[] args)
     {
          SqlConnection sqlConn = null;

          try
          {
              sqlConn = new SqlConnection ( /*Connection here*/ );
              sqlConn.Open();
 
              // Various DB things
        
              // Notice you do not need to explicitly close the connection, as .Dispose() does this for you.
          }
          catch (SqlException e)
          {
               Console.WriteLine(e.Message);
          }
          finally
          {
               if (sqlConn != null && sqlConn.State != ConnectionState.Closed)
               {
                   sqlConn.Dispose();
               }
          }
     }
}

注意到在以上代码中,SqlConnection 对象在 try/catch/finally 之外定义,这是因为在 try/catch 语句块内定义的变量无法在 finally 语句块中被访问。

try / finally

class ExceptionTest
{
     public static void Main(string[] args)
     {
          SqlConnection sqlConn = null;

          try
          {
              SqlConnection sqlConn = new SqlConnection ( /*Connection here*/ );
              sqlConn.Open();
 
              // Various DB bits
          }
          finally
          {
               if (sqlConn != null && sqlConn.State != ConnectionState.Closed)
               {
                   sqlConn.Dispose();
               }
          }
     }
}

Re-throwing exceptions

Re-throwing exceptions

标签:sqlConn,Console,C#,笔记,try,finally,catch,异常
From: https://www.cnblogs.com/snoopy1866/p/17520731.html

相关文章

  • Excel入门_2023/6/30
    常见用途整理记录(美化、简化)数据计算、分析数据展现难点问题数据量、计算效率、价值赋予、组织协作学习目标学习核心功能,解放学习思路,做到举一反三。学习方法  ......
  • CANopen转ProfiNet网关在大跨径门机起重设备同步纠偏控制应用案例
     大型门机起重设备纠偏控制系统采用CanOpen通讯协议,而PLC使用的是ProfiNet协议,看似不兼容的两种协议如何实现互通?今天我们来看一下这个案例。通过捷米特JM-COP-PN设置纠偏系统的参数,同时采集门机左右双轨的轮子多点同步控制,速度、位置等信息。在经过简单的配置后,用户可以很轻......
  • javac: invalid target release: 1.6
    Itriedtobuildaprojectonnetbeanswhenthiserrorcameup:javac:invalidtargetrelease:1.6Usage:javac<options><sourcefiles>wherepossibleoptionsinclude:-gGeneratealldebugginginfo-g:noneGeneratenodebugginginfo-......
  • Unable to update index for central http://repo1.maven.org/maven2/
    Unable to update index for central http://repo1.maven.org/maven2/ 就是这句,myeclipse启动后控制台输出这句话:解决办法:1.在myeclipse3.4(我用的这个版本)里面Window => Preferences => Myeclipse Enterprise Workbench => Maven4Myeclipse => Maven=>禁用Downl......
  • Scrapy保存数据到多个数据库
    Scrapy保存数据到多个数据库目标网站:中国福利彩票网双色球往期数据阳光开奖(cwl.gov.cn) http://www.cwl.gov.cn/ygkj/wqkjgg/代码classMongoPipeline:defopen_spider(self,spider):self.client=pymongo.MongoClient()self.ssq=self.client.bjsxt.ssq......
  • Silverlight4中用net.tcp双工方式进行通信
     先简单说一下,为了更好地实现双向通信,.NETFramework在3.0的时候引入了一个全新的通信协议Net.TCP并作为WCF的一部分。现在Net.TCP将包含在Silverlight4中,相比于HTTPPollingDuplex,它极大地改进了吞吐量和连接的数量。我们可以通过Silverlight4绑定到HTTPDuplexServices上,......
  • access violation at address in module Read of address
    AccessViolation(非法访问)错误的解决方法(转自网上)2009-02-0316:33       AccessViolation(非法访问),GeneralProtectionFault(一般保护性错误)或者InvalidPageFault(无效页面错误),虽然说法不一样,但本质上总是由同一种错误引起的。AccessViolation常常在计算机用户运行的......
  • mac os 修改zsh的提示符
    修改~/.zshrc加入这一段functionparse_git_branch(){gitbranch2>/dev/null|sed-n-e's/^\*\(.*\)/[\1]/p'}COLOR_DEF=$'%f'COLOR_USR=$'%F{243}'COLOR_DIR=$'%F{197}'COLOR_GIT=$'%F{39}'setopt......
  • 一个跨平台的`ChatGPT`悬浮窗工具
    一个跨平台的ChatGPT悬浮窗工具使用avalonia实现的ChatGPT的工具,设计成悬浮窗,并且支持插件。如何实现悬浮窗?在使用avalonia实现悬浮窗也是非常的简单的。实现我们需要将窗体设置成无边框在Window根节点添加一下属性,想要在Linux下生效请务必添加SystemDecorations属性ExtendC......
  • 小工具 | cnblogs自动上传图片并生成markdown
    博客文章在本地都是用typora写的,文本可以直接复制上去,图片一个个上传太麻烦,这里推荐一个dotnet工具,给一个本地的typora文档,它会自动读取图片,上传到cnblogs,并替换掉原文档里的图片链接很方便,mark一下,工具地址为链接......