在我的应用程序中,我有一个数据访问层,它将其他层从通信抽象到数据库。
每当捕获到异常时,我都会记录异常堆栈跟踪以帮助查明问题,然后处理异常。除了涉及连接问题外,这一切都很好,很花哨。 有时,与数据库的通信会丢失,我的日志文件会被堆栈跟踪淹没。在这种情况下,我只想记录通信丢失,并且每当通信恢复时,我也想记录它。
这是一个问题,因为我似乎无法理解SQL异常代码。我想做的是每当捕获基于连接的异常时记录连接丢失,并且每当我可以成功创建新连接时记录连接恢复。 现在看一下日志,我看到每当服务器重新启动时,我都会捕获一个数字为6005的异常。According to the reference这个数字表示:
SHUTDOWN正在进行中
这也是异常消息,因此异常与错误代码匹配。
向下滚动,我看到10054的异常,并显示以下消息:
与服务器成功建立连接,但在登录前握手期间发生错误。
但参考文献说错误10054表示
一个或多个列的数据值溢出了提供程序使用的类型。
这给我的印象是,如果我假设错误10054是登录问题,我可能会遇到问题,以防万一引发溢出异常。我想要注意的是,在我的应用程序中,溢出异常应该永远不会发生,但我不想将该假设用于异常处理,因为它实际上是常规执行的例外。
答案 0 :(得分:0)
您可以简化此操作,只需创建一个方法来为您打开数据库连接,并在失败时捕获/处理错误。像这样(未经测试):
public bool OpenConnection ()
{
try
{
using(var connection = new ADODB.Connection(...))
{
connection.Open();
return true;
}
}
catch (Exception ex)
{
// log the exception
return false;
}
}
然后在您的代码中调用该方法并在连接无法打开时处理案例:
if (OpenConnection() == false)
{
// Log / handle / throw error to state the connection failed to open
}
else
{
// Run the code
}
此方法仍会记录SQL异常,但它将避免解释单个异常的需要。您关注的是连接到数据库,无论数据库是否有效,因此这将为您提供该信息并记录确切的错误。