例外:我如何获得最可能的信息?

时间:2013-01-28 16:28:16

标签: c# .net exception logging reflection

我有一个企业应用程序,可以在发生任何事件时记录异常信息。该应用程序是C#和C ++。net。

的组合

我希望在异常时尽可能多地获取 信息。到目前为止,我们只打印出Message和堆栈跟踪(在调试版本中提供行号,但不释放)。

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

作为一个例子,我知道NullReferenceExceptions和InvalidArguementExceptions包含不同数量的信息,但我没有利用除“消息”字段之外的任何内容。

我最好的选择是使用反射并捕获所有公共成员并打印出来吗?或者可能链式TONS进行类型检查和转换,以便干净地打印出来?作为约束,我的日志记录功能只需要接受Exception类型的参数。

3 个答案:

答案 0 :(得分:8)

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

某些异常(如SqlException)也会捕获其他信息(如存储过程名称和亚麻布)。在这些情况下,序列化整个异常并将其作为XML保存在日志记录数据库中会很有帮助。请注意,并非所有异常类都可以序列化,因此请准备好在XML部分上进行操作。

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

答案 1 :(得分:4)

尝试一下:

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

它显示了很多信息,包括异常类型消息堆栈跟踪所有的消息(InnerException订购的所有例外情况。)

MSDN中的更多信息。

答案 2 :(得分: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();
    }