C# 将异常保存到数据库的安全最大varchar大小是多少?
在我们部署的C#应用程序上进行了几次令人尴尬的调试之后,我发现我可以通过获取someException.toString()来获得异常的最详细信息 因为我要把这个值记录到数据库中,所以我有点担心异常字符串会有多大。我当前的errorDetail字段设置为最多3000个字符C# 将异常保存到数据库的安全最大varchar大小是多少?,c#,exception,C#,Exception,在我们部署的C#应用程序上进行了几次令人尴尬的调试之后,我发现我可以通过获取someException.toString()来获得异常的最详细信息 因为我要把这个值记录到数据库中,所以我有点担心异常字符串会有多大。我当前的errorDetail字段设置为最多3000个字符 这是一个好的限制还是有可能得到更大的异常?答案是:不,没有真正的安全限制-如果长度太长,您必须手动缩短长度 有两种简单的方法可以使Exception.ToString()变长 原因A-异常。消息很长。 抛出异常的人可以在异常中
这是一个好的限制还是有可能得到更大的异常?答案是:不,没有真正的安全限制-如果长度太长,您必须手动缩短长度 有两种简单的方法可以使Exception.ToString()变长 原因A-异常。消息很长。 抛出异常的人可以在异常中放入很长的消息。这真是太棒了——这意味着他们正试图捕捉导致异常的尽可能多的细节,以帮助找出问题所在 原因B-堆栈跟踪可能很长。 如果异常发生在20级函数深度,堆栈跟踪将有20级细节 下面是一些简单的代码来演示这个概念:
private string GetExceptionString(int iter)
{
try
{
return RecursiveFunction(iter);
}
catch (Exception ex)
{
return ex.ToString();
}
}
private string RecursiveFunction(int iter)
{
if (iter > 1)
return RecursiveFunction(iter - 1);
throw new Exception("Actual Exception Occurs Here");
}
基本上,如果调用GetExceptionString(1000),它将在1000个嵌套函数级别内引发异常。当然,您将返回一个异常,堆栈跟踪中包含1000个详细级别,长度约为100000个字符。在.Net中,
字符串的最大大小为2GB,因此,someException.toString()
可能返回一个非常长的字符串,没有像3000个字符这样的安全最大值;我建议在将错误消息写入数据库时使用子字符串(0,3000)
。异常通常会返回长消息(在您的情况下,超过3000个字符),当它们被扔到代码深处时:“这是一只猫,它杀死了老鼠,……它躺在杰克建造的房子里。”
对于非常长的异常消息,截断时最可能丢失的是stacktrace信息。虽然您得到的monster stacktraces不适合几个KiB的实例可能只是递归上的stackoverflows,在这种情况下,stacktrace会重复自身。我建议将您的db列数据类型更改为NVarchar(max)
,并确保不会因为花时间注释而丢失任何堆栈:)。我要换成NVarchar(max)。