我有一个企业应用程序,可以在发生任何事件时记录异常信息。该应用程序是C#和C ++。net。
的组合我希望在异常时尽可能多地获取 信息。到目前为止,我们只打印出Message和堆栈跟踪(在调试版本中提供行号,但不释放)。
任何错误日志的目标都是尽可能地指出错误(尽可能接近)。我很好奇我怎么能走得更远?我想要更多信息。
作为一个例子,我知道NullReferenceExceptions和InvalidArguementExceptions包含不同数量的信息,但我没有利用除“消息”字段之外的任何内容。
我最好的选择是使用反射并捕获所有公共成员并打印出来吗?或者可能链式TONS进行类型检查和转换,以便干净地打印出来?作为约束,我的日志记录功能只需要接受Exception类型的参数。
答案 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();
}