1
我想要get方法拋出一個異常,當沒有找到記錄。我不想測試結果是否爲空。如何讓grails'在發現的記錄上拋出異常?
我想要get方法拋出一個異常,當沒有找到記錄。我不想測試結果是否爲空。如何讓grails'在發現的記錄上拋出異常?
異常是很昂貴的,因爲所有額外的堆棧框架,Groovy更是如此。當你觸發或拋出一個預期的異常時,你會產生填充堆棧框架的成本,雖然這不是很昂貴的一個例子,但它會增加生產。看看這篇文章,但要意識到如果Groovy有額外的運行,性能會更糟糕:http://shipilev.net/blog/2014/exceptional-performance/
話雖如此,我可以想到的一個快速方法來觸發缺少行的例外是使用load
方法而不是get
。 load
永遠不會返回null,它總是返回一個代理,其ID存儲在裏面。只要引用id以外的任何屬性,Hibernate就會進入數據庫並在該行沒有該行時引發異常。
更直接的選擇是將靜態方法添加到您的域類中,該類使用get
但對您進行空檢查,例如,
class MyDomainClass {
...
static MyDomainClass retrieve(id) {
MyDomainClass instance = MyDomainClass.get(id)
if (instance == null) {
throw new NotGotException(id)
}
instance
}
static class NotGotException extends RuntimeException {
NotGotException(id) {
super("No MyDomainClass found for id $id")
}
Throwable fillInStackTrace() {
return this
}
}
}
這裏我重寫fillInStackTrace
什麼也不做,以避免不必要的聚會和不必要的昂貴的成本信息。
您可能需要一些元編程。 –