Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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# 将异常保存到数据库的安全最大varchar大小是多少?_C#_Exception - Fatal编程技术网

C# 将异常保存到数据库的安全最大varchar大小是多少?

C# 将异常保存到数据库的安全最大varchar大小是多少?,c#,exception,C#,Exception,在我们部署的C#应用程序上进行了几次令人尴尬的调试之后,我发现我可以通过获取someException.toString()来获得异常的最详细信息 因为我要把这个值记录到数据库中,所以我有点担心异常字符串会有多大。我当前的errorDetail字段设置为最多3000个字符 这是一个好的限制还是有可能得到更大的异常?答案是:不,没有真正的安全限制-如果长度太长,您必须手动缩短长度 有两种简单的方法可以使Exception.ToString()变长 原因A-异常。消息很长。 抛出异常的人可以在异常中

在我们部署的C#应用程序上进行了几次令人尴尬的调试之后,我发现我可以通过获取someException.toString()来获得异常的最详细信息

因为我要把这个值记录到数据库中,所以我有点担心异常字符串会有多大。我当前的errorDetail字段设置为最多3000个字符


这是一个好的限制还是有可能得到更大的异常?

答案是:不,没有真正的安全限制-如果长度太长,您必须手动缩短长度

有两种简单的方法可以使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)。