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

What is a safe maximum varchar size for saving an exception to the database?

在我们部署的 C# 应用程序上调试问题的几次令人尴尬的尝试之后,我发现我可以通过获取 someException.toString().

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

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

答案是:不,没有真正的安全限制 - 如果长度太长,您将不得不手动 trim 降低长度。

Exception.ToString() 有两种简单的方法可以变得很长。

原因 A - Exception.Message 很长。

抛出异常的人可以在异常中放入很长的消息。这真的很棒 - 这意味着他们正在尝试捕获导致异常的原因的尽可能多的细节,以帮助查找问题。

原因 B - 堆栈跟踪可能很长。

如果异常发生在 20 级深度 function-wise,堆栈跟踪将有 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 个详细级别的异常,并且大约 hundred-thousand 个字符长。