C# try-catch 异常处理全套笔记

一、异常核心概念

异常:程序运行期间出现的错误,会导致程序直接崩溃退出。

异常处理作用 :捕捉错误、给出友好提示、保证程序不崩溃、可以重试操作。

核心语法:try-catch-finally

  • try:放置可能出错的代码

  • catch:捕获对应异常、处理错误

  • finally:无论是否报错都会执行(资源释放常用)


二、C# 常见内置异常(考试必背)

Exception :所有异常的父类/基类,可以捕获所有异常,必须写在最后

异常类型 触发场景
FormatException 数据格式错误(字符串转数字格式非法)
OverflowException 数值超出数据类型范围(int最大值/最小值溢出)
DivideByZeroException 除数为0异常
IndexOutOfRangeException 数组/集合索引越界
NullReferenceException 空引用异常(对象为null调用属性/方法)

三、多Catch分级捕获规则(重点)

  • 可以写多个catch,分别捕获不同类型异常

  • 顺序必须:子类异常在前,父类Exception在后

  • 一旦被前面精准异常捕获,后面catch不会执行

  • Exception放最后,兜底捕获所有未知异常


四、完整案例1:数字输入分级捕获异常

需求:输入数字计算10的N次方,分别捕获格式错误、溢出错误、未知错误,支持重试。

cs 复制代码
static void Main(string[] args)
{
inputNum: // 标签:用于出错后重试
    try
    {
        Console.WriteLine("请输入合法数字");
        string s = Console.ReadLine();

        // 可能报错:格式错误 / 数值溢出
        int num = int.Parse(s);
        double sum = Math.Pow(10, num);

        Console.WriteLine("计算结果:" + sum);
    }
    // 1. 精准捕获:格式错误
    catch (FormatException ex)
    {
        Console.WriteLine("异常信息:" + ex.Message);
        goto inputNum; // 回到开头重新输入
    }
    // 2. 精准捕获:数值超出int范围
    catch (OverflowException ex)
    {
        Console.WriteLine("输入数字超出范围");
        goto inputNum;
    }
    // 3. 兜底捕获:所有未知异常
    catch (Exception ex)
    {
        Console.WriteLine("无法预料的异常");
        throw ex; // 抛出异常,让程序终止
    }
}

核心知识点

  • ex.Message:获取系统自带的详细异常描述信息

  • goto 标签:实现出错重试,是控制台重试最常用写法

  • throw ex:把异常重新抛出,程序终止、方便调试

  • 不写throw:异常被吞掉,程序继续运行


五、完整案例2:数组索引越界异常捕获

需求:输入索引读取数组值,越界报错后自动重试

cs 复制代码
static void Main(string[] args)
{
i1:
    try
    {
        int a = int.Parse(Console.ReadLine());
        int[] ss = new int[] { 1, 2, 3, 4 };

        // 输入负数/大于3的索引会触发越界异常
        Console.WriteLine(ss[a]);
    }
    // 精准捕获索引越界
    catch (IndexOutOfRangeException ex)
    {
        Console.WriteLine(ex.Message + "++++++++");
        goto i1; // 重试
    }
    // 兜底所有异常
    catch (Exception)
    {
        throw; // 空throw:原样抛出捕获的异常
    }
}

六、空引用异常演示(NullReferenceException)

对象为null,直接调用成员触发异常

cs 复制代码
// 数组变量为空,没有实例化
int[] arr = null;
// 报错:空引用异常
Console.WriteLine(arr[0]);

七、throw 抛异常核心区别

  • throw ex;:抛出当前捕获的异常对象,保留异常堆栈信息

  • throw;:原样抛出捕获的异常(简写)

  • throw new Exception("自定义信息"):手动抛出自定义异常提示

  • 不写throw:异常被处理,程序继续运行,不会崩溃


八、高频易错点

  • 多个catch时,通用Exception必须放最后,否则所有异常被拦截,精准catch失效

  • 只写try必须搭配catch/finally,不能单独存在

  • goto只能跳标签,实现简易重试逻辑

  • 空对象调用方法/索引必定触发空引用异常

  • int.Parse 非数字报格式异常、超大数报溢出异常


九、异常处理背诵口诀

Try包裹风险行,Catch分级抓异常;

精准异常写在前,基类Exception兜底防;

Message拿提示,Throw抛出崩或扛;

Goto跳转做重试,程序稳定不慌张。

相关推荐
YOU OU8 小时前
Redis基础常识与命令
数据库·redis·缓存
EIP低代码平台8 小时前
EIP 低代码平台 - 角色维护
低代码·c#·权限·工作流·netcore
Database_Cool_10 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森10 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
Database_Cool_11 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白11 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
窝子面12 小时前
手搓最简前后端协作-node
javascript·数据库
吳所畏惧12 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh
DFT计算杂谈12 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习