文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-08-18 16:37

关注

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


异常指的是程序运行过程中发生的特殊响应,通常是由外部问题(如硬件、输入错误)所导致的。 在 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 关键字的简述:

在 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-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}

// 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 块内初始化的变量,只能在 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}

除了 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. 方法成员出现异常,例如说对数组元素的获取超出索引范围。

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

当基础操作失败时,.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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯