2017-05-04 18 views
0

著者が見つからなかった場合のシナリオに基づいて、withTransactionメソッド内にカスタム例外がスローされています。しかし、コードが存在しない例外ブロック内でeneteringしていても作成者は、フローの外には存在しませんが、フローに続行します。 ここに欠けていることや間違っていることがあるかどうかを確認したいだけです。Grails - withTransactionブロック内で例外が発生しない

Author.withTransaction() { 
authStatus -> def author = Author.get(id) 
if (!author) { 
log.warn "author not found" 
throw new NotFoundException('author not found') 
} 
author.status = 'completed' 
author.save() 
} 

おかげ サム

+0

「著者が見つかりません」というメッセージがログに書き込まれますが、それでもヌルオブジェクトのステータスを設定しようとしていますか?あなたのコードは正常に見えます。 – Ivar

+0

はい。それでも 'author.status = 'completed'、author.save()'のコードの次のセットで処理を進めます。 – Sam

+0

100%確実になるためには、あなたのログに「著者が見つかりません」と表示され、ステータスを設定できないためNullPointerExceptionがスローされますか?そのような場合は、プロジェクトをクリーニングして再構築する必要があります。 – Ivar

答えて

0

あなたが本当に1行にauthStatus -> def author = Author.get(id)すべてを持っているのですか?または​​のwithTransaction行にあります。通常はreturnが続行されなくなりますが、投げているので、その必要はありません。私は個人的に

Author.withTransaction { 

def author = Author.get(id) 
if (author) { 
author.status = 'completed' 
author.save() 
return author 
} 
log.warn "author not found" 
throw new NotFoundException('author not found') 
} 

にそれを変更する理由

if (author) { 
    do something 
    return 
} 
//obviously we didn't have an author since we haven't returned so back to your throw 
log.warn "author not found" 
throw new NotFoundException('author not found') 

にそのロジックを逆にしない私はおそらく周りのキャッチを試してみても、その具体的なケースを投げていないが、代わりに取得キャプチャしようとセーブ全体の事を包むだろうあなたがレコードを持っている可能性があるのでtry catchの一番下に1つのスローでエラーがありますが、それを正しく保存することができましたか?

+0

このコードが質問とは異なる理由はありません。その唯一の読みにくく、あまりにもきれいではない場合は、 "正常な"フローではなく、文で処理する必要があります例外的な状態を作者を持っていない投稿者 –

+0

@トマスBartalosはそれを論争していない、私のポイントは本当に試してみましたすべての角度から、行動に違いがあるかどうかを確認します。これは問題が解決する前に問題が挟まれる方法です。すべての角度から試して、その動作を理解してください。 – Vahid

関連する問題