【发布时间】:2021-02-15 15:17:31
【问题描述】:
我尝试将重复的书保存到我的书域类以进行测试。我有一个 try-catch(Exception ex) 来获取错误。
BookService bookService
try {
def book = new Book()
book.id = 'Lord of the Flies'
bookSerivce.save(book)
def anotherBook = new Book()
anotherBook.id = 'Lord of the Flies'
bookService.save(anotherBook)
} catch (Exception ex) {
System.out.println(ex.getMessage())
}
我使用 ex.getMessage()。我收到此错误消息。这个基本没用。
could not execute statement; SQL [n/a]; constraint [PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
另一方面,我从命令提示符控制台收到此错误消息。这个我可以用。它清楚地表明我的数据库中已经有一本名为《蝇王》的书。
2020-11-02 14:46:39.790 ERROR --- [eduler_Worker-1] o.h.engine.jdbc.spi.SqlExceptionHelper : (conn=665) Duplicate entry 'Lord of the Flies' for key 'PRIMARY'
我知道我不应该使用包罗万象的异常。我将需要使用更具体的异常类。我已经尝试过 catch (SQLException ex) 但它没有捕捉到错误。我还尝试了其他一些异常类,但它们也没有发现错误。
看起来 book.save() 和 bookServe.save(book) 也抛出了不同的异常。
你能告诉我我可以在 catch() 函数中使用哪个 Exception 类来捕获正确的错误吗?
谢谢!
【问题讨论】:
-
很难确定,因为您没有显示足够的上下文,但猜测是
rootCase异常将有您想要的。询问e.getCause(),如果不为空,请查看其消息。 -
感谢您的提示,但我不知道 rootCase 是什么。所以,我谷歌rootCase。我到了这个页面。我也不明白他们在说什么。但在底部,有人说我需要在 ex.getCause() 上做一个 while 循环才能到达最内部的异常。也许这是我需要的。 stackoverflow.com/questions/17747175/…
-
如果您只是尝试调试,您可以使用
ex.printStackTrace()记录完整的堆栈跟踪(如果您只是打印到系统输出),原因将在堆栈跟踪中列出.如果您尝试以编程方式捕获它,您可以按照您的建议遍历原因,直到找到根。 -
我的意思是,如果你捕捉到一个异常,调用它
e,然后你可以调用e.getCause()来检索你捕捉到的异常的根本原因Throwable。 -
也许我问错了问题,让这个问题难以回答。让我编辑问题。我正在使用数据服务来保存我的书。我应该问我应该使用哪个异常类来捕获错误。我已经尝试了不同的异常。他们都无法捕捉到错误。我试过 catch (SQLException.ex) 但它不会捕获错误。
标签: grails