ASP.NET / C#:如何从Exception对象中提取信息?

时间:2009-10-23 15:45:29

标签: c# asp.net event-handling

我正在使用提供API的第三方应用程序来使用其事件记录系统。我想在我的代码中捕获方法级别的异常,并将该异常传递给第三方的事件记录系统。但我不知道如何从标准的Exception对象中提取eventid,category和EventType,因此我可以将它传递给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 });
    }
}

3 个答案:

答案 0 :(得分:1)

Write()调用的参数与.NET异常对象没有任何特定关系。但是,这些参数与存储在普通Windows事件日志中的项目密切对应。根据您使用的日志记录系统,此数据可能会或可能不会在Windows事件日志中结束。它们的设计很可能是为了模仿Windows事件日志。

您为参数指定的内容取决于您的需求和目标。有些人喜欢在消息中存储Exception.ToString()的结果,类别中的应用程序或应用程序域的名称,以及eventID的用户定义的id代码。

您可能希望在消息中存储的其他可能有用的信息位是异常的类型名称,堆栈跟踪以及与异常关联的二进制数据。

最后,将0存储为错误的eventID是非典型的。这可能会使用自己的日志扫描工具甩掉其他IT人员。

System.Exception @ MSDN
System.Exception Properties @ MSDN

答案 1 :(得分:0)

您的例外不包含该信息。

生成并登录到Windows框中的事件日志的异常是两个不同的概念。

事件日志采用您描述的参数,并在生成日志条目时使用它,然后您可以在计算机的事件查看器中查看该日志条目。

这是写入事件日志的msdn article,它提供了有关这些参数用途的更多信息。

答案 2 :(得分:0)

你需要明确地将异常捕获到一个变量中,然后你可以查询它,把它拆开,把它的部分写在其他地方。

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

System.Exception是所有异常的基类,因此它可以表示引发的任何异常。查看来自MSDN的所有members of the Exception class

修改 标准的.NET Exception对象没有eventid,category和EventType,因此在写入第三方日志记录实用程序之前,您必须确定这些内容。

例如,您可以选择根据异常类型对异常进行分类,因为您可以在捕获时区分它们,

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);
}