Как получить свалку всех локальных переменных? - программирование
Подтвердить что ты не робот

Как получить свалку всех локальных переменных?

Как я могу получить дамп всех локальных и сессионных переменных при возникновении исключения? Я подумывал написать какую-то функцию, основанную на отражении, которая будет опросить вызывающую функцию и создать дамп переменных и значений.

Существует ли существующая библиотека, которую я могу использовать?

UPDATE

Поговорив с коллегой, я указал на AOP или Aspect Oriented Programming. Вот что я понимаю... Используя AOP, можно было бы просто украсить методы и классы определенными атрибутами. Платформа AOP затем вводит код внутри или вокруг этих классов и методов. Существует два разных вида фреймворка: один, который вводит код, а затем компилирует сборку, а второй просто использует отражение и ловушки вызова, который вы украсили, и обертывает любой код вокруг метода во время выполнения.

Надеюсь, все это имеет смысл. Я буду делать больше исследований по этому вопросу и опубликовать свой подход.

Спасибо, ребята...

4b9b3361

Ответ 1

Я не уверен, что это то, что вы ищете. Но если вы находитесь в блоке 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];
    }
}

Я показал, как получить имя метода, где исключение произошло только для полноты.

С BindingFlags вы можете указать ограничения, например, что вам нужны только свойства этого класса, а не наследуемые:

Использование GetProperties() с BindingFlags.DeclaredOnly в .NET Reflection

Конечно, приведенное выше должно дать вам только начальную точку, как это сделать вручную, и вы должны инкапсулировать все в классы. Я никогда не использовал его сам, поэтому он не тестировался.

Ответ 2

Вы не должны использовать обработку исключений в форме Try Catch. Скорее, это должно быть

  • Ошибка уровня страницы
  • Ошибка уровня приложения

Предположим, что у вас есть уровень презентации и уровень бизнес-логики/уровня данных.

При столкновении с ошибкой в ​​Business Logic он будет перемещаться непосредственно в файл Glogal.asax.cs в разделе Application_Error Event, не возвращаясь к вызывающей функции. Здесь вы можете зарегистрировать сообщение об ошибке, как показано ниже.

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 вы можете написать код для перенаправления пользователя на какую-либо страницу по умолчанию, как показано ниже.

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

Ответ 3

Это вопрос, заданный ad nauseum о переполнении стека, хотя и сформулирован по-разному. В одном потоке ответ был использовать PostSharp. Как другие предложили сбросить трассировку стека, вы можете это сделать. Самым простым было бы вручную сбросить локальные переменные. Это может быть либо Trace, либо вы можете создать собственный собственный обработчик исключений.