C# 异常处理、多个异常、自定义异常处理

C# 异常

异常是为处理异常的发生而设计的,这些特殊情况会改变程序执行的正常流程。 引发或引发异常。

在执行应用期间,许多事情可能出错。 磁盘可能已满,我们无法保存文件。 当我们的应用尝试连接到站点时,Internet 连接可能会断开。 所有这些都可能导致我们的应用崩溃。 程序员有责任处理可以预期的错误。

trycatchfinally关键字用于处理异常。

cs 复制代码
Program.
using System;

namespace DivisionByZero
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 100;
            int y = 0;
            int z;

            try
            {
                z = x / y;
            } 
             catch (ArithmeticException e)
            {
                Console.WriteLine("An exception occurred");
                Console.WriteLine(e.Message);
            }
        }
    }
}

在上面的程序中,我们有意将数字除以零。 这会导致错误。

cs 复制代码
try
{
    z = x / y;
}

容易出错的语句放置在try块中。

cs 复制代码
 catch (ArithmeticException e)
{
    Console.WriteLine("An exception occurred");
    Console.WriteLine(e.Message);
}

异常类型跟随catch关键字。 在我们的情况下,我们有一个ArithmeticException。 由于算术,转换或转换操作中的错误而引发此异常。 发生错误时,将执行catch关键字之后的语句。 发生异常时,将创建一个异常对象。 从该对象中,我们获得Message属性并将其打印到控制台。

cs 复制代码
$ dotnet run
An exception occurred
Attempted to divide by zero.

代码示例的输出。

C# 未捕获的异常

当前上下文中任何未捕获的异常都会传播到更高的上下文,并寻找适当的 catch 块来处理它。 如果找不到任何合适的 catch 块,则.NET 运行时的默认机制将终止整个程序的执行。

cs 复制代码
Program.
using System;

namespace UcaughtException
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 100;
            int y = 0;

            int z = x / y;

            Console.WriteLine(z);
        }
    }
}

在此程序中,我们除以零。 没有自定义异常处理。

cs 复制代码
$ dotnet run

Unhandled Exception: System.DivideByZeroException: Division by zero
  at UncaughtException.Main () [0x00000]

C# 编译器给出了以上错误消息。

C# IOException

发生 I / O 错误时,将抛出IOException。 在下面的示例中,我们读取文件的内容。

cs 复制代码
Program.
using System;
using System.IO;

namespace ReadFile
{
    class Program
    {
        static void Main(string[] args)
        {
            var fs = new FileStream("langs.txt", FileMode.OpenOrCreate);

            try
            {
                var sr = new StreamReader(fs);
                string line;

                while ((line = sr.ReadLine()) != null)
                {
                    Console.WriteLine(line);
                }

            }
            catch (IOException e)
            {
                Console.WriteLine("IO Error");
                Console.WriteLine(e.Message);
            }
            finally
            {
                Console.WriteLine("Inside finally block");

                if (fs != null)
                {
                    fs.Close();
                }
            }
        }
    }
}

始终执行finally关键字之后的语句。 它通常用于清理任务,例如关闭文件或清除缓冲区。

cs 复制代码
} catch (IOException e)
{
    Console.WriteLine("IO Error");
    Console.WriteLine(e.Message);
} 

在这种情况下,我们捕获了特定的IOException异常。

cs 复制代码
} finally
{
    Console.WriteLine("Inside finally block");

    if (fs != null)  
    {
        fs.Close();
    }
}

这些行确保关闭文件处理程序。

cs 复制代码
$ cat langs.txt
C#
Java
Python
Ruby
PHP
JavaScript

这些是langs.txt文件的内容。

cs 复制代码
$ dotnet run
C#
Java
Python
Ruby
PHP
JavaScript
Inside finally block

这是程序的输出。

我们使用 cat 命令和程序输出显示 langs 文件的内容。

C# 多个异常

我们经常需要处理多个异常。

cs 复制代码
Program.
using System;
using System.IO;

namespace MultipleExceptions
{
    class Program
    {
        static void Main(string[] args)
        {
            int x;
            int y;
            double z;

            try
            {
                Console.Write("Enter first number: ");
                x = Convert.ToInt32(Console.ReadLine());

                Console.Write("Enter second number: ");
                y = Convert.ToInt32(Console.ReadLine());

                z = x / y;
                Console.WriteLine("Result: {0:N} / {1:N} = {2:N}", x, y, z);

            }
            catch (DivideByZeroException e)
            {
                Console.WriteLine("Cannot divide by zero");
                Console.WriteLine(e.Message);

            }
            catch (FormatException e)
            {
                Console.WriteLine("Wrong format of number.");
                Console.WriteLine(e.Message);
            }
        }
    }
}

在此示例中,我们捕获了各种异常。 请注意,更具体的异常应先于一般的异常。 我们从控制台读取两个数字,并检查零除错误和数字格式错误。

cs 复制代码
$ dotnet run
Enter first number: we
Wrong format of number.
Input string was not in a correct format.

运行示例,我们得到了这个结果。

C# 自定义异常

定制异常是从System.Exception类派生的用户定义的异常类。

cs 复制代码
Program.
using System;

namespace CustomException
{
    class BigValueException : Exception
    {
        public BigValueException(string msg) : base(msg) { }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int x = 340004;
            const int LIMIT = 333;

            try
            {
                if (x > LIMIT)
                {
                    throw new BigValueException("Exceeded the maximum value");
                }

            }
            catch (BigValueException e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

我们假定存在无法处理大量数字的情况。

cs 复制代码
class BigValueException : Exception

我们有一个BigValueException类。 该类派生自内置的Exception类。

cs 复制代码
const int LIMIT = 333;

大于此常数的数字在我们的程序中被视为"大"。

cs 复制代码
public BigValueException(string msg) : base(msg) {}

在构造函数内部,我们称为父级的构造函数。 我们将消息传递给父母。

cs 复制代码
if (x > LIMIT)
{
    throw new BigValueException("Exceeded the maximum value");
}

如果该值大于限制,则抛出自定义异常。 我们给异常消息"超出最大值"。

cs 复制代码
} catch (BigValueException e)
{
    Console.WriteLine(e.Message);
}

我们捕获到异常并将其消息打印到控制台。

cs 复制代码
$ dotnet run
Exceeded the maximum value
相关推荐
言、雲5 分钟前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
Altair澳汰尔8 分钟前
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能·算法·机器学习·数据分析·知识图谱
A懿轩A33 分钟前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
汪洪墩34 分钟前
【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换
开发语言·javascript·python·ecmascript·webgl·cesium
Python机器学习AI37 分钟前
分类模型的预测概率解读:3D概率分布可视化的直观呈现
算法·机器学习·分类
云空39 分钟前
《QT 5.14.1 搭建 opencv 环境全攻略》
开发语言·qt·opencv
Anna。。42 分钟前
Java入门2-idea 第五章:IO流(java.io包中)
java·开发语言·intellij-idea
我曾经是个程序员1 小时前
鸿蒙学习记录
开发语言·前端·javascript
爱上语文1 小时前
宠物管理系统:Dao层
java·开发语言·宠物
吕小明么1 小时前
OpenAI o3 “震撼” 发布后回归技术本身的审视与进一步思考
人工智能·深度学习·算法·aigc·agi