catch(Exception ex)
//发送到数据库表进行记录的代码是 -
ex.ToString()
没有发送参数。
private int GetAge (int ID)
{
}
private string GetName (int ID)
{
}
我如何以通用方式编写,以便所有方法都可以将参数与异常(ex.ToString)连接起来?是否有任何通用方法(对于winforms)?
答案 0 :(得分: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());
}
答案 1 :(得分:0)
GetAge
或GetName
处于同一级别,则@ David的方法很好。但是,如果您的记录器处于较高级别(例如,顶级异常处理程序)并且您希望将上下文添加到较低级别的异常,则可能需要wrap exceptions而不是如果要添加上下文错误。
e.g。
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);
}
}
请注意,异常过滤器将此限制为非常特定的错误。除了顶级异常处理程序之外,您应始终将捕获限制在可以合理恢复的范围内。