通用的异常处理方式

时间:2013-02-11 17:27:57

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

catch(Exception ex)

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

  

ex.ToString()

没有发送参数。

private int GetAge (int ID)
{

}

private string GetName (int ID)
{

}

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

2 个答案:

答案 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)

如果您的记录器与GetAgeGetName处于同一级别,则@ 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);
   }

}

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