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

9vw9lbht  于 2023-10-21  发布在  .NET
关注(0)|答案(3)|浏览(115)

当异常发生时,我如何获得所有局部和会话变量的转储?我正在考虑写一些基于反射的函数,它会询问调用函数并创建变量和值的转储。
有没有我可以使用的现有图书馆?
在与一位同事交谈后,我被指向AOP或面向方面编程。这是我所理解的,使用AOP,人们会简单地用某些属性装饰方法和类。AOP框架然后在这些类和方法中或周围注入代码。有两种不同的框架,一种是注入代码,然后编译程序集;第二种只是使用反射,捕获你装饰的调用,并在运行时将任何代码 Package 在方法周围。
我希望这一切都有意义。我会做更多的研究,并张贴我的方法。

h9vpoimq

h9vpoimq1#

我不确定这是不是你要找的。但是如果你在一个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
当然,上面的内容应该给予您一个手动操作的起点,您应该将所有内容封装到类中。我自己从来没有用过,所以没有测试过。

gcxthw6b

gcxthw6b2#

不应在Try Catch表单中使用异常处理。而应
1.页面级别错误
1.应用程序级别错误
假设您有一个表示层和一个业务逻辑层/数据访问层。
在遇到业务逻辑中的错误时,它将直接移动到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事件,最后是应用程序级错误事件。您还可以在此处记录错误。
我更喜欢Application_error handler,因为如果你有20个模块,并且需要为每个模块创建基类。使代码冗余是不好的。
现在,在Web Config中,您可以编写代码将用户重定向到如下所示的默认页面。

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

iklwldmw3#

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

相关问题