Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net是否从ToString引发异常?_C#_Exception_Tostring - Fatal编程技术网

C# .Net是否从ToString引发异常?

C# .Net是否从ToString引发异常?,c#,exception,tostring,C#,Exception,Tostring,只是好奇是否有人对在我的重写ToString实现中抛出异常有任何意见。我的直觉告诉我,这可能是一种不好的做法,但我似乎找不到任何支持,如果这是坏的或不是 有什么想法吗 代码: 谢谢。如果对象处于无效状态,则应引发异常。如果我看到类似于NullReferenceException的东西,那么就让我们说我不会感到惊讶 我的理念是,我不够聪明,无法涵盖所有情况,所以我抛出异常以帮助自己和其他程序员尽早发现错误。也被称为快速失败的哲学。我不会这么做。我看不出任何情况下,让ToString()方法抛出异常

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

有什么想法吗

代码:


谢谢。

如果对象处于无效状态,则应引发异常。如果我看到类似于
NullReferenceException
的东西,那么就让我们说我不会感到惊讶


我的理念是,我不够聪明,无法涵盖所有情况,所以我抛出异常以帮助自己和其他程序员尽早发现错误。也被称为快速失败的哲学。

我不会这么做。我看不出任何情况下,让
ToString()
方法抛出异常比返回
对象.ToString()
字符串的表示形式更好

为了进行调试,通常会使用大量.ToString()调用。 现在,假设您正在调试代码并试图捕获一个bug。您的错误代码不仅会在随机位置抛出异常,还必须注意让对象的字符串表示抛出异常这一传统问题

编辑: 那么,根据你告诉我们的,
我可能不会将您正在输入的代码放入
.ToString()
。我会找到另一个方法名,比如说,
.GetXMLRepresentation()
,还有一个
.CheckIfIsInValidState()
。然后,如果您试图在无效状态下调用它,我会使
.GetXMLRepresentation()
抛出一个异常。但是我想把
.ToString()
用于其他用途。

我认为这是个坏主意。如果对象处于无效状态,那么它必须在某个点到达该位置-这是您应该抛出的位置,而不是当您将其转换为字符串时。在我看来,任何对象都应该始终具有有效的字符串表示,即使它是默认的回退(对象的类名)。

对象永远不应该处于无效状态。当使用者试图对对象设置无效状态时,该对象应立即引发异常

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

而且,由于ToString()重载可能不接受任何参数,因此它抛出异常绝不应该是调用方的错

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

编辑:对于pastebin代码,最好的方法是将查询参数合并到一个单独的类中——称之为SearchParameters或其他

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


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

异常是
对象的
ToString
方法契约的一部分,因此,在我看来,派生类实现引发的任何异常都不应该与基类实现引发的异常有所不同。我认为
ToString
不会在任何Microsoft基类中引发任何类型的异常,所以我会坚持这个惯例

正如您所说,如果抛出任何其他异常,这将是一个惊喜。程序员不喜欢惊喜。

ToString()与其他方法一样,是一种方法,因此如果您想报告执行过程中的问题,应该抛出异常(通常,不要使用异常来表示逻辑或返回结果)。如elysium所述,如果调试出现问题,您可以使用DebuggerStepThrough属性标记ToString()方法。

Gendarme(一种静态分析工具)有一个声明:

Object.ToString-调试器调用它们来显示对象,并且通常与printf样式的调试一起使用,因此它们不应更改对象的状态,也不应抛出


微软几乎没有正式发布,但这是一个很好的指标,表明在.ToString()方法中加入
ToString
方法是一种不好的做法?.ToString()方法的思想不是检查对象是否处于良好状态。如果它处于无效状态,请将其打印为字符串!例如,在调试时,这就是您希望看到的。但是,为什么在调用.ToString()时,错误会暴露出来呢?.ToString()方法应该是查找异常的最后一个位置。您应该注意对象的不变量以检查无效状态,然后引发异常,而不是等待对.ToString()的调用。我同意在ToString()中引发异常是个坏主意,如果是为了生成Xml表示,那么实现一个新方法,如ToXmlQuery()或类似的方法,然后你可以抛出一个例外。我必须同意@Jeff T和@Owned elysium。ToString应表示对象以供参考。这是序列化的情况,而不是显示(“因此可以运行”)。您没有覆盖ToString()的实现,而是覆盖了ToString()的用途。这违反了接口的精神,因为您实际上是在将返回类型从(纯文本)字符串更改为XML。@Jim:您总结为这样一句话:“您没有覆盖ToString()的实现,您覆盖了ToString()的用途。”严格地说,这是一个