4

我有一个企业应用程序,可以在发生异常信息时记录异常信息。该应用程序是 C# 和 C++.net 的组合。

我想在异常发生时获得尽可能多的信息。截至目前,我们只打印出消息和堆栈跟踪(在调试版本中提供行号,但不提供发布)。

任何错误日志的目标都是尽其所能(尽可能接近)指出错误。我很好奇我怎么能走得更远?我想要更多信息。

例如,我知道 NullReferenceExceptions 和 InvalidArguementExceptions 包含不同数量的信息,但除了“消息”字段之外,我没有使用任何东西。

我最好的选择是使用反射并捕获所有公共成员并将它们打印出来吗?或者也许链接大量的类型检查和强制转换以干净地打印出来?作为一个约束,我的日志记录函数只需要接受一个异常类型的参数。

4

3 回答 3

11

一般来说,答案是记录 ex.ToString()。通常,对象的 ToString 方法会显示对象希望您知道的内容。对于基 Exception 类,除了任何 InnerException 实例之外,还包括消息和堆栈跟踪。Exception 的特定派生类可能会显示更多信息。

像 SqlException 这样的一些异常也会捕获附加信息(如存储过程名称和行号)。在这些情况下,将整个异常序列化并将其作为 XML 保存在日志数据库中会很有帮助。请注意,并非所有异常类都可以序列化,因此请准备好在 XML 部分上踢。

此外,如果您所做的只是记录异常,那么您可能需要重新抛出异常,以便更高级别有机会处理它。当然,当您已经处于“顶级”时,这并不适用。

于 2013-01-28T16:43:42.707 回答
6

试试这个:

try 
{
    //...
}
catch(Exception ex)
{
    Messagebox.Show(ex.ToString());
}

它显示了很多信息,包括所有异常的异常类型消息堆栈跟踪InnerException所有异常排序)。

MSDN中的更多信息。

于 2013-01-28T16:33:24.613 回答
0
        private static string ErrorManager(Exception ex, bool ShowPopUp, bool CrashProgram)
    {
        string stack = ex.StackTrace;
        string source = ex.Source;
        string message = ex.Message;
        string LF = Environment.NewLine;

        string Error = $"A crash happen at {DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss.ff", CultureInfo.InvariantCulture)}{LF}" +
                       $"This is what crashed: {source}{LF}" +
                       $"This is the error message : {LF}{message}{LF + LF}" +
                       $"These are the last instructions executed before the crash : {LF}{stack}{LF + LF}";

        if (ex.InnerException != null)
        {
            Error += $"Inner Exception : {LF}{ex.InnerException.Message}";
        }

        if (ShowPopUp)
        {
            MessageBox.Show(Error, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
        }

        if (CrashProgram)
        {
            throw new Exception(Error);
        }
        return Error.Trim();
    }
于 2019-01-08T16:11:40.777 回答