java SQL异常分析

Posted

技术标签:

【中文标题】java SQL异常分析【英文标题】:java SQLException Analysis 【发布时间】:2012-07-07 11:15:44 【问题描述】:
       Connection con;
       PreparedStatement ps,p2;


       try
       
           sqlquery = "...";
           ps=con.prepareStatement(sqlquery);
           ps.executeUpdate();

          // using ps2...some similar process.......
       
       catch(SQLException sqlex)
       
              System.out.print(sqlex.getMessage());
       

我怀疑是不是

Is it possible to find out the cause of the specific error made out by a query or update such that i can handle the situation other than just displaying the error message at output console (as here) displaying the cause ?

例如:如果如果pspreparedStatement由于重复输入或ps由于某些外键问题等而出错。那么我应该能够具体分析sql错误using SQLException object 这样我就可以进行相应的处理,而不仅仅是在输出控制台中显示错误消息

我需要这个的原因是因为我想通过分析 SQLException 实例以交互方式显示用户通过 GUI 场景工作(以防万一:这里是 java swing)所做的任何错误条目。 ..

In short , how to classify errors using a single SQLException instance

对不起,如果这个问题模棱两可或愚蠢..!!!

【问题讨论】:

【参考方案1】:

如果我理解正确,您需要SQLException 类的方法getSQLStategetErrorCode

查看here 了解更多信息。

我希望这会有所帮助!

【讨论】:

@Vincenzo ....如果我得到一个重复键情况的 SQLException 是否正确......对于那种情况,它的错误代码总是相同的......以便检查我是否可以记下错误代码并在发生 SQL 异常时始终检查错误代码...是这样吗...?? 是的,它可能因数据库而异,但对于单个数据库类型,它们是标准的,我认为状态主要是标准的,但您可以检查自己。但是,出于个人经验,请将它们用于记录,而不是用于决策。 @Thihara:已更正!这是刚刚醒来的结果... -.- 请记住,getSQLState() 返回的代码是标准化的(在一定程度上),而getErrorCode() 返回的代码是特定于实现的。这意味着您通常需要使用SQLState 代码。 More info here.【参考方案2】:

SQLException 被抛出时,您可以使用SQLException 实例中的相关方法捕获错误状态、错误代码和特定消息。

    getErrorCode(), getSQLState(), 以及任何异常的常见getMessage()

mysql 在Appendix C. Errors, Error Codes, and Common Problems 记录了各种常见错误和问题,您需要在java 代码中使用这些错误和问题并进行相应处理。

正如 Vincenzo Maggio 所说,in his answer,您可以根据错误状态和代码Handle SQL Exceptions。

请注意这些错误状态,代码在不同的数据库实现中可能不一样。 各种Oracle错误代码,ORA前缀,可以在here找到。

【讨论】:

【参考方案3】:

我认为解决此问题的最简单方法是使用 getErrorCode() 并基于一些预定义的代码映射到您预先定义的用户可读消息(在文件中)来获取错误代码(例如:1045)或硬编码)以返回易于理解的消息。

一般的解决方案是解析 getMessage() 返回的消息,但我不认为 DBMS 抛出的异常有明确定义的语法,因此这样的解决方案不可行/可实施。

【讨论】:

@Razvan ....如果我得到一个重复键情况的 SQLException 是否正确......对于那种情况,它的错误代码总是相同的......以便检查我是否可以记下错误代码,并在发生 SQL 异常时始终检查错误代码……是这样吗……?? 对于一个特定的 DBMS,你所说的它是有效的。对于同一 DBMS 的不同版本,错误代码不太可能不同。但是对于不同的 DBMS,您不能保证错误代码是相同的。一种解决方案是创建您自己的抽象错误代码集,然后将特定于各种 DBMS 的错误代码的映射添加到您的抽象集中。而且,在我在实际答案中谈论的映射中,您应该使用您的抽象代码。

以上是关于java SQL异常分析的主要内容,如果未能解决你的问题,请参考以下文章

如何分析,java 虚拟机异常崩溃 由系统捕获并生成的core文件

Java中多层异常包裹时候获取最底层的最真实异常-分析Java异常栈

使用Hive SQL插入动态分区的Parquet表OOM异常分析

Java异常的深入研究与分析

java 怎么获取异常sqlcode=

java中有关异常的使用以及原理分析