似乎Microsoft创建自定义异常的指导原则规定至少应该有3个公共构造函数:空构造函数、接受消息的构造函数以及接受消息和内部异常的构造函数。我的问题是,为什么我们需要公共构造函数?如果我正在设计一个抛出一些自定义异常的框架(例如SomethingNotFoundException等(,那么我希望框架用户捕捉我的异常并处理它们,但不要抛出它们,因为框架中的API本身会抛出它们。那么,为什么不将构造函数作为内部构造函数,并且只公开用户处理这些异常所需的公共属性呢?
用户定义异常的公共构造函数是调用您的方法并必须处理可能引发的异常的客户端代码的单元测试所必需的。但是,如果构造函数需要自定义类型的参数,那么它仍然很难正确实例化。
同时,微软针对用户定义异常的指导方针与YAGNI和KISS原则相矛盾,并建议编写和保留未使用的代码。如果您没有计划序列化您的异常,为什么要使其可序列化?额外的代码需要额外的测试等等,这增加了支持成本或/和降低了可靠性。