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

时间:2012-03-20 14:43:28

标签: c# asp.net exception-handling aop

我如何获得所有本地&的转储?发生异常时的会话变量?我正在考虑编写某种基于反射的函数来询问调用函数&创建变量转储&值。

我可以使用现有的库吗?

更新

在与同事交谈后,我被指向AOP或面向方面编程。这就是我的理解......使用AOP,可以简单地修饰方法和方法。具有某些属性的类。然后,AOP框架在这些类中或周围注入代码。方法。有两种不同的框架,一种注入代码和代码。然后汇编装配&第二个只是使用反射&捕获已装饰的调用,并在运行时包装方法周围的任何代码。

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

谢谢你们......

3 个答案:

答案 0 :(得分:13)

我不确定这是否是您正在寻找的。但是如果你在一个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];
    }
}

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

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

Using GetProperties() with BindingFlags.DeclaredOnly in .NET Reflection

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

答案 1 :(得分:1)

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

  1. 页面级错误
  2. 应用程序级错误
  3. 假设您有一个表示层和一个业务逻辑层/ 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
    

    如果页面级别错误,优先级是Page OnError Override,最后是Application Level错误事件。在这里你也可以记录错误。

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

    现在,在Web Config中,您可以编写代码以将用户重定向到某个默认页面,如下所示。

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

答案 2 :(得分:0)

这是一个在Stack Overflow上遇到麻烦的问题,尽管措辞不同。在一个帖子中,答案是use PostSharp。正如其他人所建议的dumping the stack trace,你可以做到这一点。最简单的方法是手动转储局部变量。这可以是Trace,也可以创建自己的自定义异常处理程序。