在c#中显示的异常消息大小?

时间:2014-03-05 19:50:17

标签: c# exception

我必须向另一个系统输出一个Exceptions的文件,而另一个系统只接受一个单行异常,它更像是一个报告,我们需要一个简短的消息描述。

我计划仅在输出中显示Exception.Message,但请记录Exception.ToString以进行记录。

异常消息的大小是否始终为1行?是否有另一种方法可以显示这些始终位于一行的错误消息?

另外我的假设是Exception.ToString也包含StackTrace

5 个答案:

答案 0 :(得分:5)

Exception.Messagestring。因此,绝对不能保证它总能保留在一行。大多数基本的异常消息都会,有些则不会,而且自定义异常会有所期待。

如果绝对需要单行简短描述,那么您可以考虑使用SubstringReplace来满足这些要求:

var maxLength = 50; // set to desired value
var strippedMessage = exception.Message;

strippedMessage = strippedMessage.Replace("\n", string.Empty); // removes newline char
strippedMessage = strippedMessage.Replace("\r", string.Empty); // removes carriage return char

if (strippedMessage.Length > maxLength)
    strippedMessage = strippedMessage.Substring(0, maxLength - 3) + "..."; // reduces the message's size

这三个额外的点将为您提供有关已被删除的消息的线索。毋庸置疑,这里可能会丢失一些相关信息。

您还应该知道,InnerException(如果不为null)通常比Exception实例更相关。因此,如果您的“短信”旨在让您快速了解真正的问题,那么您可能需要检查一下。

是, ToString 通常包含 StackTrace ,如以及嵌套的内部异常ToString结果。我说通常是,因为ToString方法是可以覆盖的,所以有一些感觉有创意的开发人员决定在一个完全不同的自定义异常上覆盖它的可能性很小。

答案 1 :(得分:4)

由于Message是一个字符串,因此无法保证它不会包含换行符(或通常可以存储在字符串中的任何其他字符)。


是的,ToString()包含StackTrace。实际上,你会得到更多:

  • 班级名称
  • Message
  • ToString 上调用InnerException的结果(这本身就是一个例外,并以递归方式包含此列表中的所有内容)
  • 最后,StackTrace

答案 2 :(得分:4)

如果您不确定字符串是否在一行上,请用空格替换换行符

string msg = exception.Message.Replace("\r\n", " ");

我的猜测是exception.Message总是在一行上。但是没有保证。但是,Exception.ToString()将始终是包含堆栈跟踪的多行字符串。

答案 3 :(得分:3)

如果异常有一个InnerException,那么你应该添加它的消息信息......并且该异常可能有一个InnerException等等。

.ToString()很高兴知道代码中出现 Where 错误,但链接的消息很有价值。

答案 4 :(得分:3)

由于您可以使用任何字符串作为消息抛出异常,因此无法保证它只是一行。但是,您可以替换字符串中的新行。

string message = e.Message.Replace( "\n", " " ).Replace( "\r", "" );