-10
catch(Exception ex)

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

ex.ToString()

未发送参数。

private int GetAge (int ID)
{

}

private string GetName (int ID)
{

}

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

4

2 回答 2

4

这是正在记录的内容:

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());
}
于 2013-02-11T17:48:28.687 回答
0

GetAge如果您的 Logger 暴露在与or相同的级别,@David 的方法很好GetName。但是,如果您的记录器处于较高级别(例如顶级异常处理程序)并且您想将上下文添加到较低级别的异常中,那么如果您想将上下文添加到错误中,您可能希望包装异常.

例如

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);
   }

}

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

于 2013-02-11T20:37:18.970 回答