【04】C#入门到精通——C# 程序错误处理, try catch 捕获异常,避免程序崩溃

文章目录

  • [1 错误场景](#1 错误场景)
  • [2 try catch 捕获异常](#2 try catch 捕获异常)

1 错误场景

c 复制代码
using System;
//类型
//关键字
class Program
{
    static void Main()
    {
        Console.WriteLine("请输入你的年龄:");
        string age = Console.ReadLine();
        int age2 = age + 10;//C#自动做str转换
        Console.WriteLine("你的年龄是:" + age2);

        Console.ReadKey(); //等待任意键输入,继续向下执行
    }
}
c 复制代码
        Console.WriteLine("请输入你的年龄:");
        string age = Console.ReadLine();
        int age2 = int.Parse(age) + 10;//str转int需手动实现
        Console.WriteLine("你的年龄是:" + age2);

数字字符串可以转int类型的年龄,

但是当用户 输入 字母等其他非法类型的年龄时,程序无法进行 int转换,会报错,程序崩溃

2 try catch 捕获异常

可以用 try catch 捕获异常,避免程序崩溃

c 复制代码
try
 {
    //将有可能出错的内容,写到try语句里;
    //如果正确,正常执行,如果错误就会被catch抓取到,程序立马跳转到 catch,执行catch里面的内容
    //try语句里 异常的下一句不会执行
 }
 catch
 {
     //如果try内部出错,错误就会被catch抓取到,程序立马跳转到 catch,执行catch里面的内容
 
     //捕获到错误后,在这里可以做其他处理,避免程序崩溃
 }

示例, 如果try内部出错,程序立马跳转到 catch,执行catch里面的内容return;

c 复制代码
static void Main()
{
    Console.WriteLine("请输入你的年龄:");
    string str = Console.ReadLine();
    int age = 0;
    try
    {
        //将有可能出错的内容,写到try语句里;
        //如果正确,正常执行,如果错误就会被catch抓取到,程序立马跳转到 catch,执行catch里面的内容
        age = int.Parse(str);//如果异常,下面一句不会执行,程序立马跳转到 catch,
    }
    catch
    {
        //如果try内部出错,错误就会被catch抓取到,那么就执行catch里面的内容
        Console.WriteLine("请输入一个正确的年龄(必须是数字)");

        return;//程序提前结束,下面的不会在执行;(当然这里可以做其他处理)
    }

    age = age + 10;
    Console.WriteLine("你10年后的年龄是:" + age);


    Console.ReadKey(); //等待任意键输入,继续向下执行
}

上面存在一个问题,提示"请输入一个正确的年龄(必须是数字)"之后程序就结束了,用户信息并没有输入完毕;

下面改进: 如果输入非法,继续循环输入,直到输入正确为止

c 复制代码
    static void Main()
    {
        bool isCheck = true;
        int age = 0;
        while (isCheck)
        {
            Console.WriteLine("请输入你的年龄:");
            string str = Console.ReadLine();
           
            try
            {
                //将有可能出错的内容,写到try语句里;
                //如果正确,正常执行,如果错误就会被catch抓取到,程序立马跳转到 catch,执行catch里面的内容
                age = int.Parse(str);//如果异常,下面一句不会执行,程序立马跳转到 catch,
                
                
                isCheck = false;//如果上一句异常,这一句不会执行;只有正常才会执行此句,用户输入结束
            }
            catch
            {
                //如果try内部出错,错误就会被catch抓取到,程序立马跳转到 catch,执行catch里面的内容
                Console.WriteLine("请输入一个正确的年龄(必须是数字)");
                isCheck = true;//如果输入非法,继续循环输入
            }
        }

        age = age + 10;
        Console.WriteLine("你10年后的年龄是:" + age);

        Console.ReadKey(); //等待任意键输入,继续向下执行
    }

catch里面可以什么都不写,

因为,只有输入正确 try 里面的 isCheck = false;才会被执行,此时输入循环结束;

否则错误时,循环条件中一直为真,就一直循环输入,直到输入一个 可以转换为 int 数据的合法年龄为止

c 复制代码
catch
{
}

测试

c 复制代码
static void Main()
{
    bool isCheck = true;
    int age = 0;
    while (isCheck)
    {
        Console.WriteLine("请输入你的年龄:");
        string str = Console.ReadLine();
       
        try
        {
            //将有可能出错的内容,写到try语句里;
            //如果正确,正常执行,如果错误就会被catch抓取到,那么就执行catch里面的内容
            age = int.Parse(str);//如果异常,下面一句不会执行,程序立马跳转到 catch,
            
            
            isCheck = false;//如果上一句异常,这一句不会执行;只有正常才会执行此句,用户输入结束
        }
        catch
        {
        }
    }

    age = age + 10;
    Console.WriteLine("你10年后的年龄是:" + age);

    Console.ReadKey(); //等待任意键输入,继续向下执行
}