优秀的编程知识分享平台

网站首页 > 技术文章 正文

异常处理_异常处理培训心得怎么写

nanyue 2025-09-01 10:27:30 技术文章 2 ℃

A. 核心概念

  1. 异常(Exception)
    1. - 是运行时发生的错误状况,用来中断正常流程并传递错误信息。
    2. - .NET 中所有异常都继承自 System.Exception。
  2. try–catch–finally 结构
    1. - try:放置可能抛出异常的代码;
    2. - catch:捕获指定类型的异常并处理;可以有多个 catch,按从子类到父类顺序;
    3. - finally:无论是否发生异常,都会执行,用于清理资源。
  3. throw 与 rethrow
    1. - throw ex 会重置堆栈,丢失原始抛出点;
    2. - throw 而不带变量可保留原始堆栈信息。
  4. 自定义异常
    1. - 继承自 Exception 或 ApplicationException;
    2. - 实现常见构造函数(无参、带消息、带消息+内部异常);
    3. - 用于表示领域专用错误。
  5. 异常最佳实践
    1. - 只捕获你能处理的异常,不要滥用 catch(Exception);
    2. - 不用异常做正常逻辑分支;
    3. - 在 finally / using 中释放非托管资源;
    4. - 对公共 API 可抛出自定义类型,便于调用方区分;
    5. - 日志要记录关键信息(异常类型、消息、堆栈)。

B. 代码示例

using System;
using System.IO;

public class ExceptionDemo
{
    // 自定义异常
    public class BusinessException : ApplicationException
    {
        public BusinessException(string message) : base(message) { }
        public BusinessException(string message, Exception inner) : base(message, inner) { }
    }

    public void ProcessFile(string path)
    {
        try
        {
            // 可能抛出 FileNotFoundException、UnauthorizedAccessException 等
            string content = File.ReadAllText(path);
            Console.WriteLine("文件内容长度:" + content.Length);

            // 业务校验
            if (content.Length == 0)
            {
                throw new BusinessException("文件内容为空,无法处理。");
            }
        }
        catch (BusinessException bex)
        {
            // 专门处理业务异常
            Console.WriteLine("业务错误:" + bex.Message);
        }
        catch (FileNotFoundException fnf)
        {
            Console.WriteLine(#34;文件未找到:{fnf.FileName}");
            // 可以选择重新抛出或记录日志
            throw;
        }
        catch (Exception ex)
        {
            // 通用异常处理
            Console.WriteLine("发生未知错误:" + ex.Message);
            // 重新抛出,保留堆栈
            throw;
        }
        finally
        {
            Console.WriteLine("无论是否出错,都会执行的清理逻辑。");
        }
    }

    public void DemoUsing(string path)
    {
        // using 自动调用 Dispose,内部也使用 try–finally
        try
        {
            using (var reader = new StreamReader(path))
            {
                Console.WriteLine(reader.ReadToEnd());
            }
        }
        catch
        {
            Console.WriteLine("读取文件时发生错误。");
        }
    }
}

C. 自测题

  1. 写出 try、catch、finally 的执行顺序;如果 try 中有 return,finally 会不会执行?
  2. 区分 throw ex; 与 throw; 的区别,并说明在什么场景下使用后者更合适。
  3. 设计一个自定义异常 DataValidationException,包含字段 FieldName(出错字段名),并在多个构造函数中初始化它。
  4. 为什么不推荐在每个方法内部都写 catch(Exception)?请列出至少两条理由。
  5. 当需要对多个资源(如文件流、数据库连接)进行清理时,除了 using,还可以怎么做?请简要描述。
最近发表
标签列表