我有一个Actor(Play Framework,Java),用于定期进行一些数据库数据导入。这个actor调用各种其他类进行导入,持久化等。我当前的问题是我无法弄清楚生成SQL异常的确切行号和文件。例如,我得到这样的错误:
[info] application - javax.persistence.PersistenceException: ERROR executing DML bindLog[] error[ERROR: null value in column "email" violates not-null constraint\n Detail: Failing row contains (266, null, null, null).]
[info] application - Starting persisting of customer id 29917837
[error] o.j.StatementLogger - insert into emails (email, domain, user_id) values (null,null,null);
throws exception: org.postgresql.util.PSQLException: ERROR: null value in column "email" violates not-null constraint
Detail: Failing row contains (268, null, null, null).
org.postgresql.util.PSQLException: ERROR: null value in column "email" violates not-null constraint
Detail: Failing row contains (268, null, null, null).
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:645)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:495)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:441)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
at sun.reflect.GeneratedMethodAccessor16.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
当然,我可以查看错误消息,看看某处某处正试图保留我的电子邮件模型而不填充它。现在代码库非常小(约200-300行),我可以非常准确地猜测它来自哪里。但框架是否也应该报告行号?或者这可能是演员在使用时发生的事情,因为他们在某种程度上是某种形式的,在系统之外都是如此?
答案 0 :(得分:4)
您正在使用一个使用反射执行查询的框架,这使得调试非常困难。我不知道你正在使用的具体框架,但很可能它的配置可以设置为使调试这类事情更容易。
如果没有,或者它是您自己的使用反射的代码,您可以捕获异常,将其包装,并从“外部”代码(即执行反射操作的代码)中重新抛出它。这将为您提供额外的堆栈跟踪,其中包含代码中的确切位置。
例如,您可以使用包装器代码执行此操作:
try {
this.custPersister.persist(customer);
} catch (Exception e) {
throw new Exception(e);
}
只需确保在外部代码中的适当位置捕获此异常,并记录堆栈跟踪。