异常处理的通用方式

本文关键字:方式 异常处理 | 更新日期: 2023-09-27 17:58:46

catch(Exception ex)

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

前任。ToString((

参数未被发送。

private int GetAge (int ID)
{
}
private string GetName (int ID)
{
}

我如何以通用的方式编写,以便所有方法都可以具有与异常(例如ToString(连接的参数?是否有任何通用方法(针对winforms(?

异常处理的通用方式

这是正在记录的内容:

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

@David的方法很好,如果您的Logger与GetAgeGetName处于同一级别。但是,如果您是处于更高级别的记录器(例如,顶级异常处理程序(,并且您希望将上下文添加到处于较低级别的异常,则如果您希望向错误添加上下文,则可能需要包装异常。

例如

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

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