我必须向另一个系统输出一个Exceptions
的文件,而另一个系统只接受一个单行异常,它更像是一个报告,我们需要一个简短的消息描述。
我计划仅在输出中显示Exception.Message
,但请记录Exception.ToString
以进行记录。
异常消息的大小是否始终为1行?是否有另一种方法可以显示这些始终位于一行的错误消息?
另外我的假设是Exception.ToString
也包含StackTrace
?
答案 0 :(得分:5)
Exception.Message
是string
。因此,绝对不能保证它总能保留在一行。大多数基本的异常消息都会,有些则不会,而且自定义异常会有所期待。
如果绝对需要单行简短描述,那么您可以考虑使用Substring
和Replace
来满足这些要求:
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", "" );