使用MyBatis无法在Java中捕获SQLSyntaxErrorException

Met*_*d89 2 java exception-handling exception try-catch mybatis

我目前面临以下问题:

我编写了一个Java程序来解析XML数据并将数据放入数据库中.因为我使用MyBatis,所以数据库几乎可以是已经存在的每个数据库.我只会告诉你一段代码然后我会解释这个问题.

public void insert(SourceContent content){    
    SqlSession session = sqlSessionFactory.openSession();           
        try {
            session.insert("SourceDocument.insert", content);
            session.commit();
        }   catch (Exception e){
            e.printStackTrace();
        } finally {
            session.close();
        }           
    }
Run Code Online (Sandbox Code Playgroud)

这是我的DAO类,用于调用MyBatis映射文件的sql语句.如果MyBatis的映射配置正确完成,则插入我的内容(这是一个java bean的实例)会很糟糕.但是想象一下,如果我在数据库中重命名一个表,那么连接就会失败,因为配置错误.现在我想赶上即将发生的错误.当我使用上面的语句时:

catch (Exception e){
            e.printStackTrace();
        } 
Run Code Online (Sandbox Code Playgroud)

programm打印正确的异常:###原因:java.sql.SQLSyntaxErrorException:ORA-00942:Tabelle oder查看nicht vorhanden但是我不想捕获所有异常,我只是想捕获SQLSyntaxErrorException,因为我想告诉它用户,他在数据库中的表不可用.但是除了上面看到的正常异常之外,我无法捕获任何其他异常.我希望我能清楚地说出来.有人可以帮我吗?

Mar*_*nik 5

您的例外已被包含在另一个例外中.抓住其他异常,然后分析其原因.例如:

try {
   ....
} catch (PersistenceException e) {
  try { throw e.getCause(); }
  catch (SQLSyntaxException e) {
    // handle the exception
  }
}
Run Code Online (Sandbox Code Playgroud)

如果这不令人满意,您可以instanceof改为探测原因:

try {
   ....
} catch (PersistenceException e) {
  final Throwable cause = e.getCause();
  if (cause instanceof SQLSyntaxException) {
    // handle the exception
  }
}
Run Code Online (Sandbox Code Playgroud)