LoginSignup
0
1

非同期中のexceptionを共通のエラーハンドラで処理する

Last updated at Posted at 2023-06-22

今回も備忘録です。

このドキュメントについて

下記について記載していきます。
・非同期処理中の共通のエラーハンドラ実装について


非同期処理中はexceptionをthrowしても、下記記事で記載した@ExceptionHandlerでは処理されないので、非同期用のエラーハンドラが必要です。

実行環境

・Java17
・springboot 3.0.2

実装

@Slf4j
@Component
public class AsyncExceptionHandler extends AsyncConfigurerSupport {
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (e, method, params) -> {
            if (e instanceof ExampleException) {
                log.warn(e.getMessage(), e);
            } else if (e instanceof ExampleException2) {
                log.error(e.getMessage(), e);
            } else {
                log.error(e.getMessage(), e);
            }
        };
    }
}

説明:

  1. AsyncUncaughtExceptionHandlerインターフェースのhandleUncaughtExceptionメソッドをオーバーライドして、処理の内容を書き込み、AsyncUncaughtExceptionHandlerを実現したクラスをDIコンテナに登録してあげる必要がある。
    →登録しておくことで、非同期処理中に発生したExceptionを勝手に拾ってくれるようになる?

2.エラーが起きた箇所のメソッドやパラメータなど細かく引数で受け取れるが、今回はエラーメッセージとスタックトレースをログに残したかったので、exceptionごとにログレベルの異なるログを出力するようにした。


※AsyncConfigurerインターフェースを実現するでも可能
(spring 6.0以降のバージョンではAsyncConfigurerの直接実現が推奨らしい)

まとめ

非同期中でもどこでどうゆうエラーが起きたのかちゃんとログに残してあげたり、
アラートを出すべきエラーとそうでないエラーなどを分けることもできるので、
後から調査が楽になるのではと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1