現在Laravelを使用してWebアプリケーションを開発しています。
EloquentやRedisで処理が失敗する可能性がある場合にどのようなコードを書くべきか悩んでいます。
例えば、ユーザー情報(ここではメールアドレスとします。)をEloquentで保存する場合、以下のように書くと思います。(綺麗にクラス設計するといった話は無視です。本質のみに焦点を当ててますのでご了承ください。)
*サンプルコード*
lang
1class UserController extends Controller 2{ 3 /** 4 * 5 * UserはEloquentを継承。 6 * 7 * @param string $email 8 */ 9 public function postEmail(Request $request, User $user, $email) 10 { 11 $user->email = e($email); 12 $user-save(); 13 14 // 保存できたuserのEmailをRedisにも保存。 15 Redis::hmset($user->getAuthIdentifier(), ['email' => $email]) 16 17 return Response::make('ALL, OK!!'); 18 } 19}
こういうコードがあった場合に、Laravelであれば、Laravelの例外ハンドラ(App\Exceptions\Handler)でキャッチしてDBで失敗しました、というレスポンスを返すか、try~catchで例外をpostEmail内でキャッチしてエラーレスポンスを返すべきか、悩んでいます。
悩む理由ですが、ライブラリでたまにコードを見てみると例外が発生する可能性がありますが、try~catchを使用していないのを見かけるんです。そして何故そう実装するのか理由が知りたいです。
補足の説明となりますが、
EloquentやRedisに接続し、データのやり取りを行う際に、当然途中で処理に何らかの理由により失敗する可能性があると思います。ほとんどのエラー(パラメーターが不足しているとか、文法が異なるとか)は開発時に発見可能なものであると思っていまして、やり取りでエラーになるのは例えば、アクセス負荷が大きくてDBが死んだ、メモリが不足していったなどなど、コードレベルとはまた異なる領域で発生するエラーであり、コードレベルではそれらを例外として扱うことになると考えています。
ですので、私の考えとしてはLaravelの例外ハンドラでそう言った失敗系のエラーはキャッチして、適切なレスポンスを返し、失敗するのは稀でありコード上では何か特別な理由がない限り上記のサンプルコードのようにすべきかと思っているのですが、皆様のご意見を伺ってみたいと思っています。
失敗可能性のあるコードはtry~catchが入ってきてコードをうまく記述するの難しいと感じているので、
PHPにて何かうまい書き方などありましたら、ご教授いただきたいと思っています。(PHPじゃなくても何かありましたら教えていただきたいです。)
また、例外が発生する可能性がある処理(ここでは$user->save()とその後のRedis::hmset)が連続する場合も、どう例外を処理し、コードもうまく書けるか、教えて頂きたいです。
分かりづらかったらすみません。
よろしくお願いします!
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。