管理人の技術ブログです。2013-09-08例外発生時にリトライするTipsアプリケーションの要件によっては「ココは失敗してもらっちゃ困る!」という処理が出てきます。こんな場合に例外が発生したりすると、もう目も当てられない状態になります。失敗しないように制御することは大事ですが、失敗しないことを過度に期待するのは良くないです。失敗したところでやめてしまうから失敗になる。成功するところまで続ければ、それは成功になる。松下幸之助とりあえず、再試行ということで、失敗したらリトライしましょう。簡単に再試行をしようと思ったら、例えば以下のようになるでしょう。{}}しかし、要件によってはどこかで見限らなければならないケースもあります。このような場合は再試行する回数を決めるのですが、例えば5回まで再試行しようと思ったら次のようになるでしょう。{}}また、発生する例外の中でも再試行する条件を判別しようとしたら、例えば次のようになるでしょう。}}でも、このような記述を再試行が必要な箇所にちりばめるのはすこぶるメンドクサイですし、何かこうやりたい処理に集中できない感じがあります。いうことで、少し汎用化して隠蔽しましょう。再試行するためのループは記述が煩わしいので、必要な処理だけをデリゲートとして外出しして隠蔽してしまいましょう。戻り値がない場合のみ挙げていますが、戻り値を受けられるオーバーロードも作ると良いでしょう。上記のような準備をするだけで、利用側としては次のように記述できるようになります。ような記述をする必要があるということです。何か使い勝手を悪くせずに解決する良い方法はないかと考えているのですが、どれもピンと来ていません。ちなみにですが、僕はgoto文がNGだなんていう神話は信じていません。過度に使うのはどうかと思いますが、コードが意味的になって見やすくなるなら使ってイイと思っています。22:03@neueccさんに、スタックトレースを維持しつつ例外を再スローする方法を教えていただきました。4.5から搭載されたExceptionDispatchInfoクラスを利用すると良いようです。5);データベースのデッドロック検出とリトライ別のアプリケーションやスレッドから同じテーブルへの更新を行う場合など、データベース処理をしているとどうしてもデッドロックに出会ってしまう場合があります。手を尽くしてデッドロックが起こらないようにしたいものですが、避けられない場合はリトライして逃げるしかありません。データベースアクセスをする箇所はアチラコチラに出てくるので、先のようなヘルパーを使えば比較的簡単に回避できるでしょう。(1)月別アーカイブはてなブログをはじめよう!xin9leさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。