广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >【C#基础】C# 异常处理操作
  • 102
分享到

【C#基础】C# 异常处理操作

c#开发语言java 2023-08-18 16:08:46 102人浏览 安东尼
摘要

序号系列文章6【C#基础】C# 常用语句讲解7【C#基础】C# 常用数据结构8【C#基础】C# 面向对象编程 文章目录 前言1,异常的概念2,处理异常3,自定义异常4,编译器异常结语 前言 🌷大家好,我是wr

序号系列文章
6【C#基础】C# 常用语句讲解
7【C#基础】C# 常用数据结构
8【C#基础】C# 面向对象编程

前言

🌷大家好,我是writer桑,前面一章已经学习C#面向对象编程的知识点,那本章就开始学习 C# 程序中的异常处理操作。为了更好的处理在编程过程中遇到的异常问题,笔者建议大家多实践,不断从实践中总结经验。


1,异常的概念

异常指的是程序运行过程中发生的特殊响应,通常是由外部问题(如硬件、输入错误)所导致的。 在 C# 等面向对象编程语言中异常也属于对象。 C# 语言的异常处理功能处理在程序运行期间发生的任何意外或异常情况。异常处理提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。

示例如下:

public class ExceptionTest      // 异常测试 {    static double SafeDivision(double x, double y)    {        if (y == 0)            throw new DivideByZeroException();              return x / y;    }    public static void Main()    {        //用于测试的输入。更改值以查看        //异常处理行为        double a = 98, b = 0;        double result;        try        {            result = SafeDivision(a, b);            Console.WriteLine("{0} 除以 {1} = {2}", a, b, result);        }        catch (DivideByZeroException)        {            Console.WriteLine("尝试除以0错误。");        }    }}

trycatchfinallythrow 关键字的简述:

  • try 关键字声明了一个检查特定的异常的代码块,后跟一个或多个 catch 块。
  • catch 关键字需要和 try 关键字搭配,表示捕获指定的异常类型。
  • finally 关键字声明一个块来表示执行语句,而且不管程序是否抛出错误都会执行。finally 代码块适合用来释放资源。
  • 异常都是使用 throw 关键字创建而成。当需要抛出一个异常时,可以用 throw 关键字。

2,处理异常

在 C# 中,程序运行时的错误通过一种称为"异常"的机制在程序中传播。异常从错误的代码引发,由能够更正错误的代码捕作。C# 提供了内置的 try-catchtry-finallytry-catch-finally 的异常处理语句,可以使用这些语句来完成对异常发生的响应。 未能捕获的异常由系统提供的通用异常处理程序处理,该处理程序会显示一个对话框和错误信息。

示例如下:

// try-catch 语句示例public class TrycatchTest{    static void ProcessString(string s)    {        if (s == null)        {            throw new ArgumentNullException(paramName: nameof(s), message: "Parameter can't be null");        }    }    public static void Main()    {        try        {            string s = null;            ProcessString(s);        }        // 最具体的异常:         catch (ArgumentNullException e)        {            Console.WriteLine("{0} First exception caught.", e);        }        // 至少明确的异常:         catch (Exception e)        {            Console.WriteLine("{0} Second exception caught.", e);        }    }}
  • try-catch 语句包含一个后接一个或多个 catch 子句的 try 块,这些子句指定不同异常的处理程序。
  • catch 块可以指定要捕获的异常的类型,该类型规范称为异常筛选器。注意,不建议用 Exception 作为异常筛选器,除非知道如何处理 try 块中发生的所有异常,或者使用 throw 语句。
  • 异常发生时,公共语言运行时(CLR)查找处理此异常的 catch 语句。如果当前方法不包含此类的 catch 块,则 CLR 会查找类的类,依次类推直到找到匹配的 catch 块。
  • 如果未找到任何 catch 块, 则 CLR 会显示一条未处理的异常信息,并终止程序。
  • 注意 catch 块的顺序,程序在引发异常之后只要找到兼容的 catch 块就会响应。所以尽量按从最具有针对性(或派生程度最高)到最不具有针对性的顺序对 catch 块排列,让程序更高的可读性和方便调试。

// try-finally 语句的示例public class TryfinallyTest{    public static void Main()    {        int i = 123;        string s = "Some string";        object obj = s;        try        {            // 无效的转换; Obj包含字符串,而不是数字类型。            i = (int)obj;            // 不会运行下面的语句。            Console.WriteLine("WriteLine at the end of the try block.");        }        finally        {            Console.WriteLine("\nExecution of the finally block after an unhandled\n" +                "error depends on how the exception unwind operation is triggered.");            Console.WriteLine("i = {0}", i);        }    }    // 输出:    // Unhandled exception.System.InvalidCastException:    // Unable to cast object of type 'System.String' to type 'System.Int32'.     // Execution of the finally block after an unhandled    // error depends on how the exception unwind operation is triggered.    // i = 123}
  • finally 常用于关闭打开的资源(如执行文件的关闭操作),或者用于发布资源(如文件流、数据库连接和图形句柄)而无需等待运行时中的垃圾回收器来完成对象。
  • 无论 try 块内的代码是否发生异常或者 catch 块有没有执行,finally 块内的执行语句都会执行。
  • 除非程序意外终止(例如 InvalidProgramException 错误),否则 finally 语句都会执行。 如果希望 finally 块必须执行,则可以加入 catch 块或者捕获堆栈上方的 try 块引发的异常。

// try-catch-finally 语句的示例: public class TrycatchfinallyTest{    void ReadFile(int index)    {        // 要运行此代码,请替换本地机器上的有效路径         string path = @"c:\users\public\test.txt";        System.IO.StreamReader file = new System.IO.StreamReader(path);        char[] buffer = new char[10];        try        {            file.ReadBlock(buffer, index, buffer.Length);        }        catch (System.IO.IOException e)        {            Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message);        }        finally        {            if (file != null)            {                file.Close();            }        }    }} 
  • try-catch-finally 语句相当于整合了 try-catch 和 try-finally 语句的功能。
  • catch 和 finally 块常见的用法是获得并使用 try 块中的资源并处理 catch 块中的异常情况,以及释放 finally 块中的资源。

一些补充的内容:

注意在 try 块内初始化的变量,只能在 try 这个代码块内使用。否则在未对变量初始化之前,引用变量会出现异常。例如在下面的代码示例中,变量 n 在 try 块内部初始化,尝试在 WriteLine(n) 语句的 try 块外部使用此变量将生成编译器错误。

示例如下:

using System; public class Program{    static void Main()    {        int n;        try        {            // 不要在这里初始化这个变量。             n = 123;        }        catch        {        }        // Error: Use of unassigned local variable 'n'.        Console.WriteLine(n);    }}

如果使用 catch 块时想对异常进一步筛选时,可以在 catch 子句的基础上使用 when 关键字加一个布尔表达式来声明。 如果异常筛选器返回 false ,则继续搜索处理程序。

示例如下:

// 表示匹配变量 e 的 ParamName 属性等于字符串 ... catch (ArgumentException e) when (e.ParamName == "…"){    // recover from exception}

3,自定义异常

除了 C# 内置的异常之外,也可以自定义异常,然后用 throw 关键字抛出。用户自定义的异常类派生自 ApplicationException 或 Exception 类。

示例如下:

using System;class TestProgram{    static void Main(string[] args)    {        Program temp = new Program();        try        {            temp.showTemp();        }        catch (DivideByZeroException e)        {            Console.WriteLine("DivideByZeroException: {0}", e.Message);        }        Console.ReadKey();    }}public class DivideByZeroException : ApplicationException{    public DivideByZeroException(string? message) : base(message)    {    }}public class Program{    int number = 0;    public void showTemp()    {        if (number == 0)        {            throw (new DivideByZeroException("Zero Program found"));        }        else        {            Console.WriteLine("Program: {0}", number);        }    }}

当有以下情况时,开发者应引发异常:

  1. 当方法无法执行自定义的功能时,例如方法的参数是无效的值,但是程序没有处理。
  2. 一个对象执行了不允许的操作,例如对一个只读文件进行写入文本。
  3. 方法成员出现异常,例如说对数组元素的获取超出索引范围。

引发异常时应避免的做法:

  • 使用异常的同时不要在正常执行过程中改变程序的执行流,应使用异常来报告和处理错误条件。
  • 只能用 throw 关键字抛出异常,而不能作为返回值或参数返回异常。
  • 自定义异常应该保证兼容性,不能创建在调式模式抛出,但不会在发布模式下抛出的异常。
  • 请勿有意从自己的源代码中引发 System.Exception、System.SystemException、System.NullReferenceException 或 System.IndexOutOfRangeException。

4,编译器异常

当基础操作失败时,.net 运行时会自动引发一些异常。下表展示这些异常及其错误条件:

异常错误条件
ArithmeticException算术运算期间出现的异常的基类,例如 DivideByZeroException(除零异常)和OverflowException(溢出异常)。
ArrayTypeMismatchException由于元素的实际类型与数组的实际类型不兼容而导致数组无法存储给定元素时引发。
DivideByZeroException尝试将整数值除以零时引发。
IndexOutOfRangeException索引小于零或超出数组边界时,尝试对数组编制索引时引发。
InvalidCastException从基类型显式转换为接口或派生类型在运行时失败时引发。
NullReferenceException尝试引用值为 null 的对象时引发。
OutOfMemoryException尝试使用新运算符分配内存失败时引发。 此异常表示可用于公共语言运行时的内存已用尽。
OverflowExceptionchecked 上下文中的算术运算溢出时引发。
StackOverflowException执行堆栈由于有过多挂起的方法调用而用尽时引发;通常表示非常深的递归或无限递归。
TypeInitializationException静态构造函数引发异常并且没有兼容的 catch 子句来捕获异常时引发。

结语

🌺 以上就是 C# 异常处理操作的介绍啦,希望能够对大家有所帮助。望大家多多支持,你们的支持就是笔者创作最大的动力!

来源地址:https://blog.csdn.net/weixin_61361738/article/details/129210302

--结束END--

本文标题: 【C#基础】C# 异常处理操作

本文链接: https://www.lsjlt.com/news/374313.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【C#基础】C# 异常处理操作
    序号系列文章6【C#基础】C# 常用语句讲解7【C#基础】C# 常用数据结构8【C#基础】C# 面向对象编程 文章目录 前言1,异常的概念2,处理异常3,自定义异常4,编译器异常结语 前言 🌷大家好,我是wr...
    99+
    2023-08-18
    c# 开发语言 java
  • python基础之文件操作和异常处理
    目录一、文件和异常1.1从文件中读取数据1.2open()1.3关键字with1.4read()二、逐行读取三、创建一个包含文件各行内容的列表3.1readlines()四、查找字符...
    99+
    2022-11-12
  • Python基础:异常处理
    如何处理异常   无论发生什么情况,finally block 中的语句都会被执行,哪怕前面的 try 和 excep block 中使用了 return 语句。 import sys try: f = open('file....
    99+
    2023-01-31
    异常 基础 Python
  • C#多线程TPL常见操作误区与异常处理
    一、一定要async到底 一定要让async的传染性(调用异步方法要用await,用了await的方法就要声明为async,调用我这个async方法的地方必须要await.....)...
    99+
    2022-11-13
  • C++中文件操作基础详解
    目录文件操作文件分类文本文件写文件读文件二进制文件写文件读文件文件操作 意义:利用文件操作可以保存我们程序运行的信息,是持久化技术的体现 文件分类 按文件类型分为: 1、文本文件 &...
    99+
    2022-11-13
  • C#异常怎么处理
    这篇文章主要讲解了“C#异常怎么处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#异常怎么处理”吧!异常是程序运行中发生的错误,C#异常处理是程序设计的一部分。在C#异常处理是通过Exc...
    99+
    2023-06-17
  • Java 基础语法 异常处理
    目录1. 异常的背景1.1 邂逅异常1.2 异常和错误1.3 Java 异常的体系(含体系图)1.4 异常的核心思想1.5 异常的好处2. 异常的基本用法2.1 捕获异常2.1.1 ...
    99+
    2022-11-12
  • Go中的异常处理(基础)
    Go 中异常处理 主要掌握 一下几个方面: 掌握error接口 掌握defer延迟 掌握panic及recover error接口 error是指程序中出现不正常的情况,从而导致程序无法正常运行; ...
    99+
    2023-09-17
    golang 开发语言
  • C/C++中异常处理详解及其作用介绍
    目录概述异常处理异常处理机制函数声明指定异常练习案例一案例二概述 作为一名专业写 Bug, 编程一天改 bug 一周的程序媛. 学会异常处理是非常重要的. 我们不仅要考虑没有错误的理...
    99+
    2022-11-12
  • C#操作符基础知识有哪些
    这篇文章主要讲解了“C#操作符基础知识有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#操作符基础知识有哪些”吧!C# 操作符基础知识1.算术操作符算术操作符包括加(+)、减(-)、乘...
    99+
    2023-06-17
  • Python基础异常处理梳理总结
    目录前言一、常见的Python异常AssertionError:断言语句(assert)失败AttributeError:尝试访问未知的对象属性IndexError:索引超出序列的范...
    99+
    2022-11-11
  • python基础学习15----异常处理
    异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。 1.异常的类型 异常的类型多种多样,常见的异常有: AttributeError 试图访问一个对象没有的属性...
    99+
    2023-01-30
    异常 基础 python
  • Java基础之异常处理详解
    目录Exception 类的层次Java 内置异常类异常方法捕获异常throws/throw 关键字finally关键字try-with-resources声明自定义异常通用异常异常...
    99+
    2023-05-17
    Java异常处理机制 Java异常处理 Java异常
  • C++ 异常处理 catch(...)介绍
    如果要想使一个catch block能抓获多种数据类型的异常对象的话,怎么办C++标准中定义了一种特殊的catch用法,那就是” catch(…)”。 感性认识 1、catch(…)...
    99+
    2022-11-15
    异常 catch
  • C#System.TypeInitializationException异常处理方案
    目录C# System.TypeInitializationException 异常处理C#基础--错误和异常异常类捕获异常自定义异常总结C# System.TypeInitiali...
    99+
    2023-02-26
    C#异常 System.TypeInitializationException C#异常处理
  • C# System.TypeInitializationException异常如何处理
    这篇文章主要介绍“C# System.TypeInitializationException异常如何处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C# System.Type...
    99+
    2023-07-05
  • C语言操作符基础知识详解
    目录一.单目操作符:二.关系操作符三.条件操作符四.逗号表达式五.逻辑操作符总结一.单目操作符: !:逻辑反操作符; -:负数操作符; +:整数操作符; &:取地址操作符; ...
    99+
    2022-11-12
  • python基础之错误和异常处理
    import Exception # except 在捕获错误异常的时候 是要根据具体的错误类型来捕获的 # 用一个块 可以捕获多个不同类型的异常 # EXception ...
    99+
    2022-11-12
  • 深入了解C++异常处理
    目录基本的异常处理怎么抛出异常捕获和处理异常不存在异常的描述 --- 标识性作用    删减符 ...异常处理中的传参操作  --- 可以写一个变量进去可以抛出自己类的对象标准库当中...
    99+
    2022-11-12
  • c# 几个常见的TAP异步操作
    目录1 任务状态手动控制任务启动确保任务已激活2 任务取消3 进度报告4 Task.Yield 让步5 定制异步任务后续操作ConfigureAwaitContinueWith6 总...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作