每当我们用try / catch包围时,我们可以自定义catch块以包含我们的日志代码吗?

时间:2012-02-24 14:48:53

标签: c# asp.net .net visual-studio try-catch

每当我们需要异常处理时,我们将使用try / catch块进行环绕,但是当我们环绕try / catch块时,Visual studio会给出这样的结果。

try
{
}
Catch (Exception e)
{
  // here we need to write code for logging every time manually. 
}
  1. 我们可以使用我们自己的exeception日志代码自动化catch块的进程,这些代码将始终是相同的。我的意思是,每当我环绕方法时,可以自动将我们自己的日志代码包含到异常块中吗?有没有任何工具或解决方法。

  2. 要求这些的主要原因,很多jr.developer都不会处理异常或日志记录,虽然我们审查代码,但是当我们在需要记录的方法中包含try / catch块时,我应该做什么自动化,在catch块中,它将包含我们所有的日志记录代码。

  3. 可能是这样的

    Catch(Exception e ) // i am telling it for a function, not as global catch handler. 
    {                   // logging at method/function level. for method which we need to log
      ourLogging obj = new Ourlogging(); // these two line should added automaticaly, 
      obj.Publish(e);                   //as when user surrounded with try/catch block ? 
      obj = null; 
    }
    
    1. 如果有任何视觉工作室插件或一些工作,或者如果任何机构有一些工具或脚本来完成这项任务,那对许多开发人员来说会很有帮助。
    2. 我希望每个人都理解我的问题。

4 个答案:

答案 0 :(得分:3)

听起来您需要编辑Visual Studio提供的代码段。您可以通过修改通常位于此处的try.snippet文件来执行此操作:

C:\Program Files\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Visual C#

此文件的默认内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>try</Title>
            <Shortcut>try</Shortcut>
            <Description>Code snippet for try catch</Description>
            <Author>Microsoft Corporation</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
                <SnippetType>SurroundsWith</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>expression</ID>
                    <ToolTip>Exception type</ToolTip>
                    <Function>SimpleTypeName(global::System.Exception)</Function>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[try 
    {           
        $selected$
    }

    catch ($expression$)
    {
        $end$
        throw;
    }]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

您只需更新<Code>节点之间的try / catch块。

答案 1 :(得分:1)

您可以编写一个类来包装try catch代码,传入委托以在try块中执行,例如:

    public void ExecuteTryCatch<T>(Action<T> action, T genericParameter)
    {
        try
        {
            action.Invoke(genericParameter);
        }
        catch (Exception e)
        {
            //Do Logging
        }
    }

可能有一种比这更清洁的方式,但我会担心代码味道,因为你养成了捕捉所有异常相同的习惯。事实上,我会建议做这样的事情,我唯一一次做类似的事情是在一个类中,我调用不同的Web服务方法,并有一个方法来处理清理不同类型的异常连接。但这包含在一个类中,所有方法都执行类似的操作,并且他们都希望处理完全相同的异常。

您没有说明这是否适用于Windows / Web,但您应该能够轻松地拥有应用程序级别异常处理程序,该处理程序将捕获所有未处理异常以执行应用程序范围的日志记录。

答案 2 :(得分:0)

我建议你寻找一个AOP解决方案,这样你就可以在方法中应用一个方面,并且你的try / catch自定义代码被“自动”放入(事实上,由工具注入)。

对Postsharp中的这些示例进行掠夺,Postsharp是.NET中AOP的一个很好的工具:http://www.sharpcrafters.com/postsharp/documentation。您的初级开发人员可以简单地将自定义属性放在您希望处理其异常的方法上。

答案 3 :(得分:-2)

您熟悉finally (link to MSDN)吗?

最后,无论是否抛出异常,.NET都会保证每次执行块。

它本身并不是自动化的,但它足够简单,可以标准化您的日志记录代码并将其粘贴到需要的finally块中。