如果完全相同的问题发生在不同的上下文中,是否可以抛出不同的异常?

Is it okay to throw different exceptions for the exact same problem if it occurs in a different context?

我的项目(基于 C# Windows 服务)中有一个简单的问题,我无法解决这个问题。

在我的几个 类 应用程序中,我需要从应用程序配置中加载一个间隔(时间跨度)。在配置文件中,此时间跨度存储为字符串,例如“1d8h”。显然,应用程序需要解析这个字符串才能使用时间跨度。在一种情况下,我将此字符串作为参数传递给构造函数,同时初始化多个对象,这些对象都有自己的时间跨度。在构造函数中,我然后解析这个字符串并抛出一个 ArgumentException 如果解析由于任何原因失败。

在我的应用程序的其他地方我需要做完全相同的事情,但这次是在不允许有任何参数的静态构造函数中。在这种情况下,我抛出 System.Configuration.ConfigurationErrorsException 因为我没有使用任何参数,所以在这种情况下抛出 ArgumentException 是不正确的。

在这两种情况下抛出不同的异常是否完全没问题,尽管它们是由完全相同的操作引起的?如果没有,我应该怎么做?

我建议在这两种情况下都使用 FormatException

如您所说,ArgumentException 表示参数有问题,通常是其类型或种类(而 ArgumentNullException 专门用于空参数)。因此,在不接受任何参数的静态构造函数中,两者都是不可接受的。

FormatException 很合适。它表示参数本身的格式有问题,而不是它的类型或种类。它由大多数 C# 的本机 .Parse() 方法抛出,例如 DateTime.Parse()