posts - 1,comments - 0,views - 11

最近在系统学习c#的知识点,有一些知识点比较散且使用频率不高,现在此记录,便于复习。

关于c#的异常处理
一句话概括,异常是程序执行期间出现的问题,异常处理的目的是为了维护程序的健壮性和稳定性。举个栗子,比如说除以0,用户输入的数据与预设数据类型不符,数组越界,栈溢出等等。c#给我们提供了一些易于使用的解决方法。主要由四个关键词组成(当然还有其他) : trycatchthrowfinally

  • try:用于存放可能会出现问题的语句,后面可以跟多个catch
  • catch:用于捕捉异常,通常跟在try后面
  • throw:用于抛出异常,是的,你没看错,比如说为了限制输入范围,限制输入的数字为1~10之间,主要用于自定义的限制
  • finally:不管是否有异常,里面的代码块必定执行,通常跟try一起。

在菜鸟教程中,有一个易于理解的伪代码

点击查看代码
try
{
   // 引起异常的语句
}
catch( ExceptionName e1 )
{
   // 错误处理代码
}
catch( ExceptionName e2 )
{
   // 错误处理代码
}
catch( ExceptionName eN )
{
   // 错误处理代码
}
finally
{
   // 要执行的语句
}

c#中的异常类
C# 异常是使用类来表示的。C# 中的异常类主要是直接或间接地派生于 System.Exception 类。

System.ApplicationException 和 System.SystemException 类是派生于 System.Exception 类的异常类。

System.ApplicationException 类支持由应用程序生成的异常。所以程序员定义的异常都应派生自该类。

System.SystemException 类是所有预定义的系统异常的基类。

下表列出了一些派生自 System.SystemException 类的预定义的异常类:

异常类 描述
System.IO.IOException 处理 I/O 错误。
System.IndexOutOfRangeException 处理当方法指向超出范围的数组索引时生成的错误。
System.ArrayTypeMismatchException 处理当数组类型不匹配时生成的错误。
System.NullReferenceException 处理当依从一个空对象时生成的错误。
System.DivideByZeroException 处理当除以零时生成的错误。
System.InvalidCastException 处理在类型转换期间生成的错误。
System.OutOfMemoryException 处理空闲内存不足生成的错误。
System.StackOverflowException 处理栈溢出生成的错误。

通过代码来学习简单的异常处理

第一个是关于除以0的例子

点击查看代码
using System;
namespace ErrorHandlingApplication
{
    class DivNumbers
    {
        int result;
        DivNumbers()
        {
            result = 0;
        }
        public void division(int num1, int num2)
        {
            //用于防止可能出现异常的代码块
            try
            {
                result = num1 / num2;
            }
            //用于捕捉异常,有多种写法
            //1. catch (系统自带异常 e)比如下面的DivideByZeroException
            //2. catch  (Exception e) 常规所有异常
            //3. catch 可以省略括号,等同于第二种写法,但是有时候要用的参数,根据情况使用
            //4. catch (程序员自定义异常 e) <-需要注意的是,e只是一个参数名,不必过于纠结->
            catch (DivideByZeroException e)
            {
                Console.WriteLine("Exception caught: {0}", e);
            }
            //不管是否有错误,始终运行的代码
            finally
            {
                Console.WriteLine("Result: {0}", result);
            }

        }
        static void Main(string[] args)
        {
            DivNumbers d = new DivNumbers();
            d.division(25, 0);
            Console.ReadKey();
        }
    }
}

第二个例子,程序员自定义异常类型

点击查看代码
using System;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            int age;
            try
            {
                age = int.Parse(Console.ReadLine());
                if (age < 18 || age > 45)
                {
                    throw new AgeException("年龄必须在18到45岁之间!");
                }
                else
                {
                    Console.WriteLine(age);
                }
            }
            catch (AgeException e)
            {
                Console.WriteLine(e);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                Console.WriteLine();
                Console.WriteLine("输入数据错误");
            }
            finally
            {
                Console.WriteLine();
                Console.WriteLine("HELLO");
            }
        }
    }
}

public class AgeException: ApplicationException
{
    public AgeException(string message) : base(message)
    {

    }
}

关于catch的小知识点
不管是程序员自定义的异常类型,还是系统自带的异常类型,都继承于 System.Execption 类。catch的规则是执行完第一个符合异常的 catch 后面就不会再执行了,所以说越具体的要放在越前面。
学习参考
菜鸟教程 - https://www.runoob.com/csharp/csharp-exception-handling.html
微软官方doc - https://docs.microsoft.com/zh-cn/dotnet/csharp/fundamentals/exceptions/
《visual c#从入门到精通》- 第六章

posted on   南有青鸟  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示