You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#项目中不同上下文的相同错误能否抛出不同类型的异常

结论

你当前的做法完全符合.NET异常设计规范,是合理的。

合理性依据

异常的核心作用是向调用方传递错误的上下文和根因,和底层触发错误的操作没有强制绑定关系:

  • 实例构造函数场景中,错误的直接原因是调用方传入了非法的入参,抛出ArgumentException完全匹配该异常的设计用途:当调用方传入的参数不符合方法/构造函数的要求时触发。
  • 静态构造函数场景中,没有外部传入参数的动作,错误根因是应用配置的内容不符合预期,抛出ConfigurationErrorsException是完全正确的选择,该类型本身就是.NET类库专门为配置加载失败的场景设计的。

优化方案

虽然异常抛出逻辑没问题,但重复的时间跨度解析逻辑建议抽离复用,避免两处维护相同代码:

  1. 把通用的"1d8h"格式字符串转TimeSpan的逻辑抽成独立的公共解析类,提供两种调用方式:
public static class CustomTimeSpanParser
{
    // 不抛异常的解析方法,供上层自行处理错误
    public static bool TryParse(string input, out TimeSpan result)
    {
        // 把你之前两处重复的解析逻辑移到这里实现
        result = default;
        if (string.IsNullOrWhiteSpace(input)) return false;
        // 具体解析逻辑省略
        return true;
    }

    // 抛通用解析异常的方法,适用于不需要区分场景的调用方
    public static TimeSpan Parse(string input)
    {
        if (!TryParse(input, out var result))
        {
            throw new FormatException($"输入字符串{input}不是有效的时间跨度格式");
        }
        return result;
    }
}
  1. 两个场景分别调用解析方法后抛出对应场景的异常即可:
  • 实例构造函数场景:调用TryParse失败时抛出ArgumentException,提示入参无效
  • 静态构造函数场景:调用TryParse失败时抛出ConfigurationErrorsException,提示配置项格式错误

这样既保留了符合场景的异常类型,又避免了解析逻辑重复维护的问题,后续如果要调整解析规则只需要修改一处即可。


内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:39:02