【问题标题】:Grails Don't Know How To Get ExceptionGrails 不知道如何获取异常
【发布时间】: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


【解决方案1】:

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

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
   }
}

【讨论】:

  • 这似乎不是我的一个简单问题。但我现在确实理解问题并回答了。问题是在通用 Exception 类中嵌套了 5 到 6 个不同的异常。我应该问问自己,这些 5/6 例外中哪一个对我来说最有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
相关资源
最近更新 更多