首页 > 解决方案 > Grails 不知道如何获取异常

问题描述

我尝试将重复的书保存到我的 Book 域类以进行测试。我有一个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() 函数中使用哪个异常类来捕获正确的错误吗?

谢谢!

标签: grails

解决方案


下面的问题和评论对我来说并不是特别清楚,但要调查的是异常的根本原因:

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())
   Throwable t = ex.getCause()
   if(t) {
        // interrogate t as the root cause
   }
}

推荐阅读