ASP.NET/C#: как извлечь информацию из объекта Exception?

Я использую стороннее приложение, которое предоставляет API для использования их системы регистрации событий. Я хочу поймать исключение на уровне метода в своем коде и передать это исключение в стороннюю систему регистрации событий. Но я не знаю, как извлечь eventid, категорию и EventType из стандартного объекта Exception, чтобы я мог передать его в Write (строковое сообщение, строковая категория, int eventID, EventType eventType).

public EventLogs 
{
    private EventLogs()
    {
    }    
    public static void Write(EventLogEntry entry)
    {
        try
        {
            if (Globals.IsNullorEmpty(entry.MachineName))
            {
                entry.MachineName = Environment.MachineName;
            }
            if (!Globals.IsNullorEmpty(entry.Message))
            {
                entry.Message = Globals.HtmlEncode(entry.Message);
            }
            CommonDataProvider.Instance().WriteEventLogEntry(entry);
        }
        catch
        {
        }
    }

    public static void Write(string message, string category, int eventID, EventType eventType)
    {
        Write(message, category, eventID, eventType, -1);
    }

    public static void Write(string message, string category, int eventID, EventType eventType, int settingsID)
    {
        Write(new EventLogEntry { Message = message, Category = category, EventID = eventID, EventType = eventType, SettingsID = settingsID });
    }
}

person burnt1ce    schedule 23.10.2009    source источник


Ответы (3)


Параметры вызова Write() не имеют никакого отношения к объектам исключений .NET. Однако эти параметры близко соответствуют элементам, хранящимся в обычном журнале событий Windows. В зависимости от используемой вами системы ведения журнала эти данные могут попасть или не попасть в журнал событий Windows. Вполне вероятно, что их дизайн предназначен для имитации журнала событий Windows.

То, что вы указываете для параметров, зависит от ваших потребностей и целей. Некоторым людям нравится сохранять результаты Exception.ToString() в сообщении, имя приложения или домен приложения в категории и определяемый пользователем код идентификатора для идентификатора события.

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

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

System.Exception @ MSDN< br> Свойства System.Exception @ MSDN

person meklarian    schedule 23.10.2009

Ваше исключение не содержит этой информации.

Генерируемое исключение и регистрация в журнале событий в вашем окне Windows — это две разные концепции.

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

Вот статья msdn о записи в журнал событий , он содержит больше информации о том, для чего используются эти параметры.

person Joseph    schedule 23.10.2009

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

catch(Exception exc)
{
    Console.Write(exc.Message);
}

System.Exception — это базовый класс для всех исключений, поэтому он может представлять любое возникающее исключение. Просмотреть всех членов класса Exception из MSDN.

Редактировать. Стандартный объект исключения .NET не имеет идентификатора события, категории и типа события, поэтому вам нужно решить, какими они будут, прежде чем писать в стороннюю утилиту ведения журнала.

Например, вы можете классифицировать исключения на основе типа исключения, потому что вы можете различать их при перехвате следующим образом:

catch(FileNotFoundException fnfExc)
{
    Logger.Log(fnfExce.Message, CategoryEnum.DiskError);
}
catch(FilePermissionError permExc)
{
    Logger.Log(permExc.Message, CategoryEnum.DiskError);
}
catch(Exception exc)  { //catches anything else not caught above
    Logger.Log(exc.Message, CategoryEnum.Uknown);
}
person John K    schedule 24.10.2009