【问题标题】:Generic way of exception handling [duplicate]异常处理的通用方式[重复]
【发布时间】:2013-01-26 20:51:30
【问题描述】:
catch(Exception ex)

//发送到数据库表记录的代码是 -

ex.ToString()

参数未发送。

private int GetAge (int ID)
{

}

private string GetName (int ID)
{

}

我如何以通用方式编写,以便所有方法都可以将参数与异常(ex.ToString)连接起来?有没有通用的方法(对于winforms)?

【问题讨论】:

  • 什么参数没有被发送到什么?
  • 我想捕获方法正在使用的参数(例如:ID),我可以在每个方法内部编写以将参数连接到 ex.ToString(),但是方法太多了,有什么通用的方法吗?
  • 您想记录哪些“缺失”,或者您想记录所有方法参数的名称/值对?
  • 一般来说,您不应该捕获无法适当处理的异常。此外,您真的不想将异常连接到参数。您应该允许异常出现并修复根本原因。
  • -1。请使用“编辑”按钮并使用throw new Exception() 的方法添加示例,尝试/捕获并评论您想在哪里记录内容。

标签: c# .net vb.net exception exception-handling


【解决方案1】:

这是正在记录的内容:

ex.ToString()

大概是因为这就是您要记录的全部内容。我想像这样的东西是日志语句吗?:

catch (Exception ex)
{
    Logger.Log(ex.ToString());
}

向正在记录的内容添加更多信息的方法是将其传递给记录器。像这样的:

catch (Exception ex)
{
    Logger.Log(string.Format("Failed to get a Name for the ID: {0} - Exception was: {1}", ID, ex.ToString()));
}

这是假设您只记录字符串。您也许可以扩展它以包含更多强类型数据,也许将自定义异常直接传递给记录器本身。如果不了解更多有关记录器的功能,很难说。也许是带有泛型类型参数的自定义异常,它在内部将参数添加到其字符串表示中?同样,如果没有更多信息,在这个简单的示例中很难说。

至于使整个事物通用化,这完全取决于您自己的设计。在您提供的两个方法签名中,只有一个参数。因此,自定义异常上的单个通用属性将适用于此。具有多个参数的方法呢?具有超出其自身参数的上下文的方法呢? (例如,方法类的实例属性。)

每个异常都可能有很大的不同。每个代码块都是域中自己的一段逻辑。并且提供带有错误的有意义的上下文(顺便说一句,这是一件优秀的事情)通常对这些代码块的逻辑差异非常主观。有时是强类型信息,有时是关于情况的人类可读上下文等。

使用遗留代码,一种可行的长期方法是识别需要额外信息的错误并修改错误处理代码以提供该信息。您通常可以在一次生产过程中捕捉到很多它们,但会有一些落后者。随着时间的推移,这个数字会减少。从管理层的角度来看,这不是最理想的方法,因为它通常需要两个生产版本来修复一个错误(一个版本添加更多日志记录,另一个版本在提供必要的运行时信息后实际修复错误)。但是,好吧,这就是这些新奇的坏代码所带来的技术债务:

catch (Exception ex)
{
    Logger.Log(ex.ToString());
}

【讨论】:

    【解决方案2】:

    如果您的 Logger 暴露在与 GetAgeGetName 相同的级别,@David 的方法很好。但是,如果您的记录器处于较高级别(例如,顶级异常处理程序)并且您想将上下文添加到较低级别的异常中,您可能需要 wrap exceptions 而不是如果您想将上下文添加到错误。

    例如

    private int GetAge (int ID)
    {
       try 
       {
            GetAgeFromFile(ID)
    
    
       }
       catch {System.IO.Exception e }
       {
            throw new CommunctionError(
            string.Format("Cannot access age file ID:{0}.",ID) ,
            e);
       }
    
    }
    

    请注意,异常过滤器将其限制为非常具体的错误。除了顶级异常处理程序之外,您应该始终将捕获限制在可以合理恢复的范围内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多