Java try-catch子句不适用于

Java try-catch子句不适用于,java,sql,sql-server,exception-handling,try-catch,Java,Sql,Sql Server,Exception Handling,Try Catch,当我向ID提供非法值时,我希望尝试失败并触发catch子句 PreparedStatement ps1=conn.prepareStatement("insert into Table_1(id values(?)"); try{ ps1.setString(1,ID); ps1.executeUpdate(); conn.commit(); } catch(Exception EX){ logger.error("Failed insert to tab

当我向ID提供非法值时,我希望尝试失败并触发catch子句

PreparedStatement ps1=conn.prepareStatement("insert into Table_1(id values(?)");    
try{
    ps1.setString(1,ID);
    ps1.executeUpdate();
    conn.commit();
} catch(Exception EX){
    logger.error("Failed insert to table "+v.getId());
    logger.error(EX.getMessage(), EX);
    EX.printStackTrace();
    try{
        conn.rollback();
    }catch(Exception ex){
        ex.printStackTrace();
        logger.error("Cannot rollback connection");
        logger.error(ex.getMessage(),ex);
        System.exit(1);
    }
}
相反,我得到以下异常,程序终止。问题似乎与ps1.executeUpdate有关;线路

java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]Disallowed implicit conversion from data type ntext to data type varchar, table 'Table_1', column 'id'. Use the CONVERT function to run this query.
我可以得到一个异常,而且,我想在ID非法时得到一个异常。然而,我不明白为什么catch子句没有被触发


有什么想法吗?

SQL字符串不正确。这样做:

insert into Table_1 (id) values(?)

首先,查询缺少一个括号。 正确的查询是:

PreparedStatement ps1 = conn.prepareStatement("insert into Table_1(id) values(?)");    
其次,我觉得记录器没有正确初始化,因此catch块的功能不可见。但是,由于EX.printStackTrace,您得到了错误堆栈跟踪。您有一个无效的:


问题不在try-catch块中,如果是这样,则应该由try-catch处理。 这只是一个错误的sql语句。我也推荐

同时尝试以下解决方案

PreparedStatement ps1=conn.prepareStatement("insert into Table_1(id) values(?)"); 

try{
    ps1.setString(1,ID);
    ps1.executeUpdate();
    conn.commit();
} catch(Exception EX){
    logger.error("Failed insert to table "+v.getId());
    logger.error(EX.getMessage(), EX);
    EX.printStackTrace();
    try{
        conn.rollback();
    }catch(Exception ex){
        ex.printStackTrace();
        logger.error("Cannot rollback connection");
        logger.error(ex.getMessage(),ex);
        System.exit(1);
    }
}

第一行出错..将id放在一边。。。括号未关闭

表1 D缺少一个辅助语句?准备语句在try/catch块之前。因此,错误不会被捕获。
conn.prepareStatement("insert into Table_1(id) values(?)"); 
PreparedStatement ps1=conn.prepareStatement("insert into Table_1(id) values(?)"); 

try{
    ps1.setString(1,ID);
    ps1.executeUpdate();
    conn.commit();
} catch(Exception EX){
    logger.error("Failed insert to table "+v.getId());
    logger.error(EX.getMessage(), EX);
    EX.printStackTrace();
    try{
        conn.rollback();
    }catch(Exception ex){
        ex.printStackTrace();
        logger.error("Cannot rollback connection");
        logger.error(ex.getMessage(),ex);
        System.exit(1);
    }
}