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
类的方法getSQLState
和getErrorCode
。
查看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异常栈