C# 层次结构违反了Liskov-那又怎样?

C# 层次结构违反了Liskov-那又怎样?,c#,inheritance,liskov-substitution-principle,C#,Inheritance,Liskov Substitution Principle,我使用的API违反了Liskov替换原则:它抛出自己的扩展异常的异常类型,但将来自基类的异常消息放在新的ErrorCode字段中,并将自己的(无用的)消息放在message字段中。因此,为了显示正确的消息,我需要将异常转换为DerivedException类型,并使用ErrorCode字段。如果我将其视为异常对象,则会得到错误的消息 从风格上来说,这让我很恼火,但这很容易解决:我只需要捕获DerivedException并按照编程人员的意图使用它。所以我的问题是:利斯科夫原理有什么大不了的?使用

我使用的API违反了Liskov替换原则:它抛出自己的扩展异常的异常类型,但将来自基类的异常消息放在新的ErrorCode字段中,并将自己的(无用的)消息放在message字段中。因此,为了显示正确的消息,我需要将异常转换为DerivedException类型,并使用ErrorCode字段。如果我将其视为异常对象,则会得到错误的消息

从风格上来说,这让我很恼火,但这很容易解决:我只需要捕获DerivedException并按照编程人员的意图使用它。所以我的问题是:利斯科夫原理有什么大不了的?使用违反原则的层次结构时,人们可能会遇到哪些实际问题?

一个实际例子:

如果您有一个带有方法
LogException(Exception ex)
的日志类,它将记录您认为无用的消息,而不是“真实”消息


日志方法的描述将从“记录异常消息”更改为“记录异常消息,但有时记录无用消息”

函数F想要一个类型为T的对象,你给它传递一个声称是有效的T的东西,但随后表现不同;也就是说,有一些属性对T有效,F可能依赖于这些属性,但是你的对象不满足它们。会发生什么?差不多什么都可以。错误、失败、崩溃、房屋烧毁。

因此抛出的异常不会包装原始异常,例如:
抛出新的DerivedEx(“message”,originalEx)
?这很糟糕,这也是你需要投下它的原因。请API的开发人员解决这个问题。让他们读这本书。完全正确。我会问他们,只是期待他们的反对,这将有效地是“那又怎样?”