【发布时间】:2014-06-12 15:15:52
【问题描述】:
我知道这个问题没有多大意义,所以这里举个例子。 我有一个库,客户可以在其中构建可能需要很长时间的 sql 查询。 超时时,sql reader 会抛出 SqlException。 可能有这个库的消费者专门监听 SqlException。
在这里,我想将实际的命令文本返回给异常处理程序。 SqlException 是密封的,不提供公共构造函数,因此我可以实例化一个新的 SqlException,也不能使用自定义消息实例化派生类,例如 " 执行的 Sql 命令:Select * from ... "
现在,我将原始 SqlException 作为内部异常抛出新异常,但它可能会让消费者错过这个异常。
任何帮助将不胜感激。 请注意,我不是在问这是否是传递异常信息的正确方法。我们本可以使用某种日志记录、回传消息或其他方式,但他们也有自己的问题,所以我正在探索这个选项。
编辑:使用 ex.Data 的问题是消费者必须知道才能检查它。为了提供更多信息,我的库被用于许多地方,包括遗留代码。我希望我的图书馆的消费者做今天所做的同样的事情(没有代码更改),但是当他们记录 Exception.ToString() 时,我的附加消息会显示在那里。我的图书馆和所有消费者都是内部的,不发货,所以记录 Exception.ToString() 很好,但它似乎没有暴露数据。
【问题讨论】:
-
在考虑更改异常中的任何内容之前,您应该确定异常的使用者实际上会使用您添加的内容。他们将如何处理这些额外信息?
-
这是我们整个内部系统的核心库,大多数消费者在可重试的 sql 异常上重试。当重试不起作用时,一些消费者选择在事件日志中记录异常,一些消费者选择向正确的别名发送电子邮件等等。我希望所有包含“Ex.Tostring()”的消费者都能获得额外的信息我免费提供,无需更改代码,因为我无法访问所有消费者,其中一些是遗留代码
-
我明白为什么 Exception.Message 只有 get 访问器,但如果有另一个属性 AdditionalMessage 或类似的东西会很好,这样我就可以用自定义消息重新抛出