【问题标题】:can we customize catch block to include our logging codes, every time whenever we surround with try/catch?每次我们用 try/catch 包围时,我们可以自定义 catch 块以包含我们的日志记录代码吗?
【发布时间】:2012-03-15 00:24:31
【问题描述】:

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

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

  2. 1234563 ,在 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. 如果有任何 Visual Studio 插件或一些解决方法,或者如果任何机构有一些工具或脚本来完成这项任务,这将对许多开发人员有所帮助。

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

【问题讨论】:

  • 您似乎想要大规模记录并吞下异常。您可能有这样做的理由,但总的来说这不是一个好主意。一个好的策略是在调用堆栈的根部捕获异常并相应地对它们做出反应(包括日志记录)。这样做不需要太多的异常处理程序,您需要自动化来创建它们。
  • @MartinLiversage 不在全球范围内,我在说每种方法。我们写函数的地方。我说的是一些功能
  • 好吧,我在这里闻到了异常反模式的味道,但也许有一些关于你的架构我不知道的地方? devlicio.us/blogs/billy_mccafferty/archive/2007/11/30/…
  • 我们使用 3 层架构。我想要什么,每当我们在方法中用 try/catch 块包围时,我都需要放置日志记录代码。

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


【解决方案1】:

你熟悉finally (link to MSDN)吗?

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

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

【讨论】:

  • 我终于知道了,我问的是自动化,如何定制。最后登录是不好的。它将记录所有内容:-/
  • 通过使用变量,您可以将日志记录限制为仅在引发异常时进行 - 但我承认这不是您感兴趣的解决方案。祝您好运找到更符合您要求的东西。
  • 好吧,如果你要称我为骗子,那么我很乐意投反对票,所以我们都再次诚实。美好的一天...
  • 我认为说代码保证在finally块中执行有点误导,这真的取决于抛出的异常,有些异常是不可恢复的,我认为StackOverflowException是一个常见的异常导致这种情况,以及进程被杀死,当然机器实际上已经关闭。
  • @MattT 我并不是说我好像对你有好感,我只是个人觉得有些人可能会浏览保证之类的词并得到错误的印象,说明警告,即使是简短的也可以对其他人有所帮助,仅此而已:0)。
【解决方案2】:

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

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

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

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

【讨论】:

  • 它的网络应用程序..你能解释一下这里的代码异味是什么意思吗:p?
  • 你可以看看 Elmah,它是一个用于应用程序范围日志记录的开源库,我已经在几个项目中成功地使用了它,并且易于集成和配置。 code.google.com/p/elmah
【解决方案3】:

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

从 Postsharp 中获取这些示例,这是 .NET 中 AOP 的绝佳工具:http://www.sharpcrafters.com/postsharp/documentation。您的初级开发人员可以简单地将自定义属性放在您想要处理其异常的方法中。

【讨论】:

    【解决方案4】:

    听起来你需要编辑Visual Studio提供的代码sn-p。您可以通过修改通常位于此处的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>
    

    您只需要更新 &lt;Code&gt; 节点之间的 try/catch 块。

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 2018-08-22
      • 1970-01-01
      相关资源
      最近更新 更多