我正试图从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;
}
答案 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块的原因