如何获取所有局部变量的转储?

发生exception时,如何转储所有本地和会话变量? 我正在考虑编写某种基于reflection的函数,该函数将询问调用函数并创建变量和值的转储。

我可以使用现有的库吗?

UPDATE

在与同事交谈后,我被指向AOP或面向方面编程。 这就是我的理解……使用AOP,可以简单地用某些属性修饰方法和类。 然后,AOP框架在这些类和方法中或周围注入代码。 有两种不同的框架,一种是注入代码然后编译程序集,另一种是简单地使用reflection和陷阱你已经装饰的调用,并在运行时包装方法周围的代码。

我希望所有这些都有意义。 我将对此进行更多研究并发布我的方法。

多谢你们 …

我不确定这是不是你想要的。 但是如果你在一个catch-block中,你可以通过以下方式获得该类的所有字段和属性:

try { double d = 1 / 0; } catch (Exception ex) { var trace = new System.Diagnostics.StackTrace(); var frame = trace.GetFrame(1); var methodName = frame.GetMethod().Name; var properties = this.GetType().GetProperties(); var fields = this.GetType().GetFields(); // public fields // for example: foreach (var prop in properties) { var value = prop.GetValue(this, null); } foreach (var field in fields) { var value = field.GetValue(this); } foreach (string key in Session) { var value = Session[key]; } } 

我已经展示了如何获取方法名称,只是为了完整性而发生exception。

  • Type.GetProperties方法
  • Type.GetFields方法
  • PropertyInfo.GetValue方法
  • FieldInfo.GetValue方法
  • StackTrace类

使用BindingFlags,您可以指定约束,例如,您只需要此类的属性而不是inheritance的属性:

在.NET Reflection中使用GetProperties()和BindingFlags.DeclaredOnly

当然上面的内容应该只给你一个如何手动完成的起点,你应该将所有内容封装到类中。 我自己从未使用它,所以它没有经过测试。

您不应在Try Catch表单中使用exception处理。 相反,它应该是

  1. 页面级错误
  2. 应用程序级错误

假设您有一个表示层和一个业务逻辑层/ DataAccess层。

在面对Business Logic中的错误时,它将直接移至Application_Error Event下的Glogal.asax.cs文件,而不返回调用函数。 在这里,您可以记录如下错误消息….

 HttpContext.Current.Server.GetLastError().InnerException.StackTrace HttpContext.Current.Server.GetLastError().InnerException.Message HttpContext.Current.Server.GetLastError().InnerException.Source HttpContext.Current.Server.GetLastError().InnerException.TargetSite.DeclaringType.FullName HttpContext.Current.Server.GetLastError().InnerException.TargetSite.DeclaringType.Name HttpContext.Current.Server.GetLastError().InnerException.TargetSite.DeclaringType.Namespace 

在页面级别错误的情况下,优先级是页面OnError覆盖,最后是应用程序级别错误事件。 在这里你也可以记录错误。

我更喜欢Application_error处理程序,因为如果你有20个模块,那么当你需要为每个模块创建基类时就会出现这种情况。 制作代码冗余并不好。

现在,在Web Config中,您可以编写代码以在一些默认页面上重定向用户,如下所示。

    

这是一个在Stack Overflow上遇到麻烦的问题,尽管措辞不同。 在一个post中,答案是使用PostSharp 。 正如其他人建议转储堆栈跟踪 ,你可以这样做。 最简单的方法是手动转储局部变量。 这可以是Trace,也可以创建自己的自定义exception处理程序。