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

本文关键字:转储 局部变量 何获得 | 更新日期: 2023-09-27 18:28:27

如何获得所有本地&发生异常时的会话变量?我正在考虑写一些基于反射的函数,它会询问调用函数&创建变量转储&价值观

我可以使用现有的图书馆吗?

更新

在与一位同事交谈后,有人向我介绍了AOP或面向方面编程。以下是我的理解。。。使用AOP,可以简单地修饰方法&具有某些属性的类。AOP框架然后在这些类中或围绕这些类注入代码&方法。有两种不同的框架,一种是注入代码&然后编译程序集&第二种简单地使用反射&捕获已修饰的调用,并在运行时将任何代码包装在方法周围。

我希望这一切都有意义。我会在这方面做更多的研究;张贴我的方法。

谢谢大家。。。

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

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

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];
    }
}

为了完整起见,我已经展示了如何获取异常发生的方法名称。

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

使用BindingFlags,您可以指定约束,例如,您只想要此类的属性,而不想要继承的属性:

在.NET反射中使用带有BindingFlags.DeclaredOnly的GetProperties()

当然,以上内容应该只为您提供一个如何手动完成的起点,并且您应该将所有内容封装到类中。我自己从来没有用过,所以它没有经过测试。

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

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

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

在say 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

在页面级错误的情况下,Priority是page OnError Override,最后是Application level错误事件。您也可以在这里记录错误。

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

现在,在Web配置中,您可以编写代码在如下默认页面上重定向用户。

<customErrors defaultRedirect="ErrorPage.htm" mode="On">
   <error statusCode="404" redirect="ErrorPageNotFound.htm"/>
</customErrors>

这是关于Stack Overflow的一个令人恶心的问题,尽管措辞不同。在一个帖子中,答案是使用PostSharp。正如其他人建议转储堆栈跟踪一样,您可以这样做。最简单的方法是手动转储局部变量。这可以是Trace,也可以创建自己的自定义异常处理程序。