.Net从ToString中抛出异常?

Teh*_*One 6 c# exception tostring

只是好奇是否有人对我重写的ToString实现中抛出异常有任何意见.我的直觉告诉我这可能是不好的做法,但如果这是坏事,我似乎无法找到任何支持.

有什么想法吗?

代码:http://pastebin.com/mLEkBAAz

谢谢.

dev*_*ium 8

我不会这样做.我没有看到任何情况下让ToString()方法抛出异常而不是例如返回Object.ToString()字符串的表示更好.

您通常使用大量.ToString()调用进行调试.现在,假设您正在调试代码并尝试捕获错误.您的错误代码不仅会在随机位置抛出异常,您还必须处理让对象的字符串表示抛出异常的附加问题.

编辑:

所以,通过你告诉我们的内容,我可能不会把你所放的代码放进去.ToString().我会找到另一个方法名称,比方说,.GetXMLRepresentation()我也有一个.CheckIfIsInValidState().然后,.GetXMLRepresentation()如果你试图以无效状态调用它,我会抛出异常.但我想.ToString()用于其他目的.

  • 我必须同意@Jeff T和@devoured elysium.ToString应该表示对象以供参考.这是序列化的情况,而不是显示("因此可以运行").你没有覆盖ToString()的*implementation*,你正在覆盖ToString()的*purpose*.这违反了接口的精神,因为您实际上是将返回类型从(纯文本)字符串更改为XML. (3认同)
  • 我同意在ToString()中抛出异常是一个坏主意,如果它是用于创建Xml表示然后实现像ToXmlQuery()之类的新方法,那么你可以从那里抛出异常. (2认同)

Rei*_*aka 6

对象永远不应处于无效状态.一旦消费者尝试在其上设置无效状态,该对象就应抛出异常.

您的对象可能处于不可用状态(比如它是一个数据库连接对象,它还没有连接),在这种情况下它应该有一个IsConnected标志,或者它应该遵循状态机模式,以便对象的状态仍然是本身有效.

并且因为你的ToString()重载可能不会带任何参数,所以它应该永远不会是调用者的错误,它会引发异常.

因此,不,我想不出ToString()会抛出的任何异常.

编辑:在使用pastebin代码的情况下,最好的方法是将查询参数合并到一个单独的类中 - 称之为SearchParameters或其他类.

首先填充它,然后将其传递给将生成SQL代码的类.如果将SearchParameters对象传递给SearchQuery(可能通过构造函数使其可以使其不可变)参数无效,则可以在那里抛出异常.

这样,如果您的SearchQuery对象有更多的方法依赖于有效的搜索查询,您将不需要重复验证代码,当然,ToString()永远不会抛出异常.