每当我们使用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.
}
我们可以用我们自己的执行日志记录代码来自动化catch块的过程吗。我的意思是,每当我包围方法时,都可以自动将我们自己的日志记录代码包含到异常块中?周围有工具或工作吗。
要求这些的主要原因是,许多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;
}
- 如果有任何visualstudio插件或一些解决方案,或者任何机构都有一些工具或脚本来完成这项任务,这对许多开发人员来说都会很有帮助
我希望每个人都能理解我的问题。
听起来您需要编辑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块中。