每当我们使用try/catch时,我们是否可以自定义catch块以包含我们的日志代码

本文关键字:我们 catch 自定义 代码 日志 包含 try 是否 | 更新日期: 2023-09-27 18:25:37

每当我们需要处理异常时,我们都会用try/catch块包围,但当我们包围try/catch时,Visual studio会给出这样的结果。

try
{
}
Catch (Exception e)
{
  // here we need to write code for logging every time manually. 
}
  1. 我们可以用我们自己的执行日志记录代码来自动化catch块的过程吗。我的意思是,每当我包围方法时,都可以自动将我们自己的日志记录代码包含到异常块中?周围有工具或工作吗。

  2. 要求这些的主要原因是,许多jr.developer不会处理异常或日志记录,尽管我们审查了代码,但我认为无论何时,只要我们在需要日志记录的方法中包围try/catch块,它都会使自动化,在catch块中,它将包括我们所有的日志记录代码。

可能像这个

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. 如果有任何visualstudio插件或一些解决方案,或者任何机构都有一些工具或脚本来完成这项任务,这对许多开发人员来说都会很有帮助

我希望每个人都能理解我的问题。

每当我们使用try/catch时,我们是否可以自定义catch块以包含我们的日志代码

听起来您需要编辑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块。

您可以编写一个类来包装try-catch代码,传递委托在try块中执行,类似于:

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

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

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

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

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

您是否熟悉finally(MSDN链接)?

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

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