Как получить дамп всех локальных переменных? - PullRequest
19 голосов
/ 20 марта 2012

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

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

ОБНОВЛЕНИЕ

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

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

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

Ответы [ 3 ]

13 голосов
/ 20 марта 2012

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

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

1 голос
/ 20 марта 2012

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

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

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

При возникновении ошибки, скажем, в Business Logic, он будет перемещен непосредственно в файл Glogal.asax.cs в Event_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 модулей, и возникает ситуация, когда вам нужно создать базовый класс для каждого модуля.Нехорошо создавать избыточность кода.

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

<customErrors defaultRedirect="ErrorPage.htm" mode="On">
   <error statusCode="404" redirect="ErrorPageNotFound.htm"/>
</customErrors>
0 голосов
/ 20 марта 2012

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

...