MySQL try-catch无法正常工作

时间:2013-04-22 21:45:09

标签: c# mysql exception-handling

我正试图从MySQL中捕获error 1045 (access denied),但我遇到了一些奇怪的问题。我的代码有问题吗?

不是处理异常而是在VS中抛出一个吗?

private bool connOpen()
{
    bool kleir = false;
    try
    {
        conn.Open();
        kleir = true; // throws exception here
    }
    catch (MySqlException ex)
    {
        switch (ex.Number)
        {
            case 1045:
                MainWindow.connError = true;
                break;
        }
        kleir = false;
    }
    return kleir;
}

2 个答案:

答案 0 :(得分:1)

假设你在VS中调试它。即使你有一个异常处理程序,VS也会停止异常,因为你处于调试模式。如果你在工作室之外运行它,那么异常将由块处理。您还应该只需按F5(运行)即可继续。

但是,在我看来,这只是一个侧面展示。你展示的代码非常糟糕。这个片段意味着您正在打开一个连接,使用它来进行一个或多个数据库调用,然后沿着另一个方法关闭它。

您永远不应该从实际使用它们的位置初始化/管理连接。连接池能够正确处理大量连接/断开连接。你应该将这些代码放在一起的原因很简单,就是在连接上打开/关闭之间的事情越多,你的代码就越不能正确处理这些对象。当它们没有被丢弃时,连接池将会出现非常奇怪且难以调试的问题,并且内存使用量也会增加。

连接和命令数据库对象是非托管对象。它们实现IDisposable,因为它们控制非托管资源。正确的方法是:

using (SqlConnection conn = new SqlConnection(connstring)) {
  using (SqlCommand cmd = new SqlCommand(conn)) {
    // do atomic database stuff
  }
}

using语句将自动关闭并处理这些对象。连接池(您甚至不需要考虑)将确保如果您调用上述代码1000次,它仍然可以超快地运行。

答案 1 :(得分:0)

我怀疑当您尝试打开连接时会抛出异常,但菜单DEBUG.Exceptions.Common Language Runtime Exceptions中的对话框的复选框标记在Thrown列下方。这应该是您的代码在显示的行停止并且不进入catch块的原因

相关问题