[Day27]C# 鸡础观念- 做错事该怎麽办呢?~错误处理

人总是会有犯错的一天,
程序想必也是如此,
但犯错之後该怎麽办呢?
我们今天来探讨C#的错误处理

异常(Exception)/images/emoticon/emoticon77.gif

  • 程序不可能万无一失,总会有出错的一天
  • 但如果不处理这些错误,可能会造成程序崩溃

范例:我们写一个分数,并看看分母为零会发生什麽事情吧

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CsharpDemo
{


    class Program
    {
        static void Main(string[] args)
        {
            //宣告分子
            int x = 100;

            //宣告分母
            int y = 0;

            int z = x / y;

            Console.WriteLine("结果 : " + z);

            Console.ReadKey();
        }
    }
  }

结果:

未处理的例外状况: System.DivideByZeroException: 尝试以零除。
於 CsharpDemo.Program.Main(String[] args) 於 C:\CsharpDemo\Program.cs: 行 21

我们会发现程序抛出了一个DivideByZeroException类别的错误,来提醒开发者发生什麽事情了

捕捉异常~try-catch/images/emoticon/emoticon34.gif

  • try-chatch 能帮我们把异常捕捉出来,并且让我们决定後续的处理

范例:我们让使用者输入分母,并且来捕捉错误吧

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CsharpDemo
{


    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("请输入分母");
                //宣告分子
                int x = 100;

                //宣告分母
                int y = Convert.ToInt32(Console.ReadLine());

                int z = x / y;

                Console.WriteLine("结果 : " + z);
            }
            catch (DivideByZeroException)//捕捉分母为0的错误
            {
                Console.WriteLine("分母不可以为0");
            }
            catch (FormatException)//捕捉格式错误
            {
                Console.WriteLine("格式不正确");
            }

            Console.ReadKey();
        }
    }
  }

输入:

0

结果:

请输入分母
0
分母不可以为0

输入:

孤独一只鸡

结果:

请输入分母
孤独一只鸡
格式不正确

最後的处理~try-catch-finally/images/emoticon/emoticon35.gif

  • 人不管有没有犯错,还是得吃饭
  • 程序也一样,有些事情就算犯错了还是得吧他做完

范例:我们来试试看吧

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CsharpDemo
{


    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("请输入分母");
                //宣告分子
                int x = 100;

                //宣告分母
                int y = Convert.ToInt32(Console.ReadLine());

                int z = x / y;

                Console.WriteLine("结果 : " + z);
            }
            catch (Exception ex)//捕捉所有发生的错误,如果不知道可能会发生的错误可以使用此类别
            {
                //ex.Message可得到简易的错误描述,如果需要详情,建议使用 ex.ToString()
                Console.WriteLine(ex.Message);
            }
            finally//最终要处理的事情
            {
                Console.WriteLine("既然都犯错了,那就收工吃饭吧!");
            }


            Console.ReadKey();
        }
    }
  }

输入:

0

结果:

请输入分母
0
尝试以零除。
既然都犯错了,那就收工吃饭吧!

把异常丢出来~throw

  • 如果原本的异常不够我们用,那我们就人工来抛异常吧

范例:我们来输入1~10的数字吧,超过就把错误抛出来

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CsharpDemo
{


    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("请输入1~10任一数");
                int number = Convert.ToInt32(Console.ReadLine());

                //判断是否有超过范围
                if (number < 1 || number > 10)
                {
                    //抛出超出范围的异常
                    throw new IndexOutOfRangeException();
                }
                else
                {
                    Console.WriteLine("你输入了 : " + number);
                }
            }
            catch (Exception ex)//捕捉所有发生的错误,如果不知道可能会发生的错误可以使用此类别
            {
                //ex.Message可得到简易的错误描述,如果需要详情,建议使用 ex.ToString()
                Console.WriteLine(ex.Message);
            }
            finally//最终要处理的事情
            {
                Console.WriteLine("既然都犯错了,那就收工吃饭吧!");
            }


            Console.ReadKey();
        }
    }
  }

输入:

11

结果:

请输入1~10任一数
11
索引在阵列的界限之外。
既然都犯错了,那就收工吃饭吧!

今天学会错误处理之後,程序就不会因为一点点小毛病就当掉啦,期待我们明天再会啦


<<:  Day 16:把做好的 HTML 加入 Angular 吧!

>>:  前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day28 留言电子邮件通知

Day3-安装JDK

前言 提到JDK就不得不提到JRE了,先来介绍他们之间的差别吧。 JRE:Java Runtime ...

【Day14】浅谈系统入侵System Hacking(一)

哈罗, 我们在前面几天学习了以下这些主题: 资讯蒐集(Footprinting) 网路扫描(Scan...

[前端暴龙机,Vue2.x 进化 Vue3 ] Day5. Vue的起手开发

接下来,开始看看如何着手进行 Vue 的开发吧 这边都是透过最原始、最简单的网页开发模式进行,所以不...

[ Day6 ] General Skills 小柚子

大家中秋节快乐 有没有烧肉吃饱饱,剥柚子,带柚子帽呢? 今天正15,月亮超级圆好漂亮喔 今天是我们来...

Day 09 : 资料库 Postgres

接着进入一个全新的篇章,介绍一下资料库。其中资料分析基础能力之一是可以从资料库拿取资料,因此我们需要...