【Spring Boot】キャッチされていない例外を最終的にキャッチする

Keywords

  • Spring Boot

Contents

  • 1. 概要
  • 2. 既にあるControllerAdviceの優先順位を高める
  • 3. 最終的にキャッチするための処理を書く
  • 4. 参考URL

概要

AWSのSDKやMySQLなどのDBには、それらを使う側のプログラマでは把握しきれないほどの例外があります。

その例外のキャッチ(catch)を忘れてしまうと、エンドユーザに例外のメッセージが表示されてしまい、どのようなアーキテクチャを採用しているかの情報が漏れてしまいます。

それを防ぐために、プログラマがキャッチしきれない例外でも、最終的にはキャッチしたいというニーズがあるとお思います。

本稿では、その方法を説明します。

既にあるControllerAdviceの優先順位を高める

既存にあるControllerAdviceのクラスに@Order(Ordered.HIGHEST_PRECEDENCE)を付加します。

ControllerAdviceの優先順位は変更可能です。こちらを参考にしてください。

@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class WebControllerAdvice {

    @ExceptionHandler(WebExchangeBindException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Mono handleException(WebExchangeBindException ex) {
        // 省略
    }
}

最終的にキャッチするための処理を書く

@RestControllerAdvice
public class WebControllerAdviceDefault {
    @ExceptionHandler(Throwable.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Mono handleException(Throwable throwable) {
        // 既存のcatch句でキャッチされていない場合の処理を書く
    }
}

参考URL

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html