【问题标题】:SQLite - executeUpdate exception not caught when database does not exist? (Java)SQLite - 数据库不存在时未捕获执行更新异常? (爪哇)
【发布时间】:2013-10-22 11:49:43
【问题描述】:

所以我故意试图破坏我的程序,我成功了。

在创建连接后,我在程序运行时删除了程序使用的 sqlite 数据库。然后我尝试更新数据库,如下所示。

Statement stmt;
try
{
    stmt = Foo.con.createStatement();
    stmt.executeUpdate("INSERT INTO "+table+" VALUES (\'" + itemToAdd + "\')");
}
catch(SQLException e)
{
    System.out.println("Error: " + e.toString());
}

问题是,它没有捕捉到异常,继续运行,就好像数据库更新成功一样。与此同时,数据库在那时甚至都不存在,因为这是在我删除它之后。

  • 更新的时候不检查数据库是否还在吗?
  • 是否必须在每次更新时手动检查数据库连接以确保数据库没有损坏/删除?
  • 这是通常的做法,还是有更简单/更稳健的方法?

谢谢。

【问题讨论】:

  • 在进一步分析之前,1) 我会打印出连接字符串并确保它指向您关闭的任何数据库。 2) 确保数据库真的宕机了。
  • 您在哪个平台上运行? Windows、Linux、Mac?

标签: java database sqlite exception


【解决方案1】:

有趣的是,我发现如果我在使用数据库时删除它然后尝试更新它,它会在新位置(在垃圾箱中!)更新数据库。当它在垃圾桶中并且您正在通过您的程序访问它时,您无法永久删除它。

【讨论】:

    【解决方案2】:

    看起来这不是抛出的 SQLException...

    尝试捕捉每一种异常类型,看看你是否得到了错误:

    Statement stmt;
    try
    {
        stmt = Foo.con.createStatement();
        stmt.executeUpdate("INSERT INTO "+table+" VALUES (\'" + itemToAdd + "\')");
    }
    catch(Exception e)
    {
        System.out.println("Error: " + e.toString());
    }
    

    Statement stmt;
    try
    {
        stmt = Foo.con.createStatement();
        stmt.executeUpdate("INSERT INTO "+table+" VALUES (\'" + itemToAdd + "\')");
    }
    catch(Throwable e)
    {
        System.out.println("Error: " + e.toString());
    }
    

    【讨论】:

    • 我试过ExceptionThrowable,但我仍然遇到同样的问题
    • 你使用事务吗?如果是这样,您是否提交了事务(删除数据库的事务)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2023-04-09
    • 2012-10-02
    相关资源
    最近更新 更多