2016-09-28 8 views
1

サーバーエラーが発生したとき(たとえば、除算、メモリ不足例外など)に通知を受けたいWebサービスを開発しました。私は、カスタム内の各リクエストに対してこのエラーを処理して送信するのがよい練習であるかどうか疑問に思っていますErrorHandlerPlay Frameworkのサーバーエラーで電子メールを送信する

package controllers; 

import play.*; 
import play.api.OptionalSourceMapper; 
import play.api.UsefulException; 
import play.api.routing.Router; 
import play.http.DefaultHttpErrorHandler; 
import play.mvc.Http.*; 
import play.mvc.*; 

import javax.inject.*; 
import java.util.concurrent.CompletableFuture; 
import java.util.concurrent.CompletionStage; 

@Singleton 
public class ErrorHandler extends DefaultHttpErrorHandler { 

    @Inject 
    public ErrorHandler(Configuration configuration, Environment environment, OptionalSourceMapper sourceMapper, Provider<Router> routes) { 
     super(configuration, environment, sourceMapper, routes); 
    } 

    // Invoked in prod mode when a server error occurs. 
    protected CompletionStage<Result> onProdServerError(RequestHeader request, UsefulException exception) { 
     return CompletableFuture.completedFuture(Results.internalServerError("A server error occurred (prod): " + exception.getMessage()) 
       // Send email 
     ); 
    } 

    protected CompletionStage<Result> onDevServerError(RequestHeader request, UsefulException exception) { 
     return CompletableFuture.completedFuture(
       Results.internalServerError("A server error occurred (dev): " + exception.getMessage()) 
     ); 
    } 
} 

答えて

1

これは、非致命的なエラーのために有用である可能性があります。しかし、致命的なエラーの場合、これは動作しません。ロギングやその他のプロセス例外監視ソリューションを使用する方が優れています。

+0

私は同じ考えをしていました。私はちょうどログバックを使用し、特定のログレベルのメッセージ(この場合はエラーメッセージ)でトリガされるsmtpアペンダを書きます。ここで私が見ている問題は、クライアントとサーバーのエラーを区別することができないことです(たとえば、無効なjsonの場合はエラーが記録されますが、電子メールを送信したくないということです)。私はPlayで致命的なエラーが記録されてもそれができますが、私が間違っていないとサポートされていないのですか? – martez

+0

logg内の特定のタグを使用してログステートメントを相違させる – pamu

+0

これは、各コントローラに対して、キャッチされない例外をチェックしてログに記録する必要があるということですか?もう一つのオプションは、デフォルトのキャッチされていない例外ハンドラを設定することですが、私はどこにそれを置くための参照を見つけることができませんでした。最初の記事では、致命的なエラーはonProdServerErrorによって処理されないと述べました。あれは正しいですか? – martez

関連する問題