try catch块中的代码重复

bre*_*ree 23 c# exception-handling asp.net-mvc-4

是否有更好的方法来捕获异常?我好像在复制很多代码.基本上在每个控制器中我都有一个catch语句来执行此操作:

try
{
     Do  something that might throw exceptions.
}
catch (exception ex)
{
     Open database connection
     Save exception details.
     If connection cannot be made to the database save exception in a text file.
}
Run Code Online (Sandbox Code Playgroud)

我在每个控制器中有4个控制器和大约5-6个动作方法,这是很多代码重复.如何减少上面try catch语句中的行数?

Har*_*der 40

您可以在此处使用Extension方法.

在新类中创建扩展方法.

public static class ExtensionMethods
{
    public static void Log(this Exception obj)
    {
        // log your Exception here.
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它像:

try
{
}
catch (Exception obj)
{
    obj.Log();
}
Run Code Online (Sandbox Code Playgroud)

  • +1隐藏答案"只需将所有异常处理代码放入静态方法并调用该方法".是否使用扩展方法是一个品味问题,`MyErrorHandler.Log(ex)`也一样好. (8认同)
  • @Val:我相信SE/SO是所有知识级别的人都可以提问的地方.我坚信SE/SO是一个互相帮助的地方; 不要互相评判. (3认同)
  • 我没有给出这样的答案,因为它不能是程序不知道能够分解重复代码片段的函数.程序员不能问这样的问题.我想知道谁构成了stackoverflow的大部分内容. (2认同)

Job*_*mno 13

您不需要在每个方法上放置try/catch块.那是乏味而痛苦的!相反,您可以使用Global.asax 的Application_Error事件来记录异常.下面的代码是示例实现,可用于捕获Web应用程序中发生的异常.

protected void Application_Error(object sender, EventArgs e)
{
    var error = Server.GetLastError();
    if (!string.IsNullOrWhiteSpace(error.Message))
    {
        //do whatever you want if exception occurs
        Context.ClearError();
    }
}
Run Code Online (Sandbox Code Playgroud)

我还要强调,"处理异常"特别是尝试在大多数方法上放置try/catch块是"IIS/ASP.NET应用程序的前三大静默性能杀手"之一,如本博客中所述:http:// mvolo的.com/FIX-所述-3-高CPU-性能问题换IIS-ASPNET的应用程式/

  • 在ASP.NET MVC中,您还可以使用过滤器作为捕获控制器中错误的更好方法. (3认同)
  • 你可能误解了这篇文章:使用`try/catch`确实*不*(或只能忽略不计)影响性能.实际*抛出的异常*会影响性能. (2认同)

Wou*_*ort 11

你想要做的事情被称为跨领域的关注点.您正在尝试记录代码中任何位置发生的任何错误.

在ASP.NET MVC中,可以通过使用过滤器来实现横切关注.过滤器是可以全局应用于控制器或方法的属性.它们在执行操作方法之前或之后运行.

您有几种类型的过滤器:

  • 授权过滤器,它们运行以检查是否允许用户访问资源.
  • 动作过滤器,它们在动作方法执行之前和之后运行.
  • 结果过滤器,这些可用于更改操作方法的结果(例如,向输出添加一些额外的HTMl)
  • 抛出异常时会运行异常过滤器.

在您的情况下,您正在寻找异常过滤器.这些过滤器仅在操作方法中发生异常时运行.您可以全局应用过滤器,以便它可以自动运行任何控制器中的所有异常.您也可以专门在某些控制器或方法上使用它.

在MSDN文档中,您可以找到如何实现自己的过滤器.