オンライン教育プロジェクト [統一された例外処理]

目次

1. 例外処理の統一

例外を均一に処理する必要があるのはなぜですか? 

1.1: 例外に対するシステムの応答をテストする

例外をグローバルに処理する 2 つの方法

最初の方法: try...catch で例外を処理する    

2 番目の方法: 例外処理クラスを構成する

1.3: 特別な例外処理の設定

1.4: カスタム例外

1.4.1: EduException ジェネリック例外クラス

1.4.2: catch カスタム例外クラスを作成する

1.4.3: 例外ツール クラス


1. 例外処理の統一

例外を均一に処理する必要があるのはなぜですか? 

ユーザーが製品を体験しているときに、製品に問題があると、400、404、403、500 などのエラーが報告されますが、この例外をユーザーに報告するのはやりすぎです。しかし、例外が発生することは避けられません.ここでは、ユーザーフレンドリーなプロンプトを提供するために、統一された例外キャプチャと処理が実行されます.

1.1: 例外に対するシステムの応答をテストする

例: 教師サービスでは、講師を追加するときに、時間が [yyyy-MM-dd HH:mm:ss] の形式に従って追加されません。

デモ プログラムは次のエラーを報告します。

例外をグローバルに処理する 2 つの方法

最初の方法: try...catch で例外を処理する    

プログラム エラーは上で示したもので、try catch で解決します。

この問題は、ティーチャー サービスでティーチャー コントローラーを追加するときに発生します. コントローラーでティーチャーを追加する方法に例外を設けます. 試して ...catch

    @ApiOperation("添加老师")
    @PostMapping
    public BaseResult addteacher(@RequestBody EduTeacher eduTeacher){
        boolean flag = false;
        try {
            flag = eduTeacherService.save(eduTeacher);
            throw new RuntimeException("报错了");
        } catch (Exception e) {
          return BaseResult.error("系统错误");
        }
     
    }

ここで例外が正常にキャプチャされます 

しかし、それぞれの方法の例外を試してみると、コストがかかりすぎて非常に面倒です。2 番目の方法でグローバル処理を行うことができます

2 番目の方法: 例外処理クラスを構成する

  • spring mvc提供@RestControllerAdvice注解

  • @ControllerAdviceこれはコントローラーを拡張するアノテーションであり、次の 3 つの主な機能があります。

    1. グローバル例外処理 (*)

    2. グローバル データ バインディング

    3. グローバル データの前処理

common モジュール: zx_common_practise モジュールで例外処理クラスを構成します。

 注: この構成クラスを正常にロードするには、スプリング ブート クラスをスキャンして、

このようにして、TeacherApplication は、書き込まれた例外パッケージに正常にスキャンできます。 

@RestControllerAdvice  // 对Controller进行增强也就是说进行处理,
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)//拦截什么异常
    public BaseResult error(Exception e){
        e.printStackTrace();
        return BaseResult.error("系统错误");
    }

 効果を見てみましょう:

0 による除算の例外をシミュレートし、すべての教師をクエリする方法で 0 による除算の例外をシミュレートします。

    @GetMapping
    @ApiOperation("查询所有老师")
    public BaseResult findAll(){

        List<EduTeacher> list = eduTeacherService.list();
        //添加一个除0异常
        int exception = 1/0;
        return BaseResult.ok("查询成功",list);
    }

 Swagger テスト: システム エラーはここで正常にキャプチャされます

注: @RestControllerAdvice および @controllerAdvice は、@ResponseBody と同じ意味です。

これは、コントローラー クラスの各メソッドに try...catch を追加することと同じです。 

将来の開発で例外が処理された後は、表示されなくなります。例外情報を取得する 2 つの方法

オプション 1: 開発ノードの単純な処理、コンソールへの例外の出力

オプション 2: 環境を構築します。[log log] を使用して例外を記録します

1.3: 特別な例外処理の設定

特別な例外処理構成とはどういう意味ですか? 簡単に言えば、例外を処理する方が正確です

In the following figure, try...catch the exception in the controller method. This is the same exception and the maximum exception in the Exception in the Unified Configuration exception. 例外は下の左の図で複数の例外をキャッチできることは誰もが知っている. , そして精度はより慎重です. 例外が最大の例外であるように, 例外をより正確にキャプチャできます!

 例外構成クラスで例外を正確にキャプチャして処理する. 以下は、0 以外の例外のデモです。

0 以外の例外は ArithmeticException であることがわかります。これは、正確な処理のために例外処理クラスで特別にキャプチャされます。

 

1.4: カスタム例外

上記のグローバル統合例外処理と特別な例外処理のように、すでにほとんどの一般的な問題を処理できます

カスタム例外があるのはなぜですか? カスタム例外は、今後の開発の大部分を占めます。

例えば:

ユーザーを追加する関数を作成すると、そのメソッドは Serive で実装され、追加の成功または失敗によってブール値 true または false が返される場合がありますが、これは通常のロジックです。

複雑なユーザーが追加されました. 追加する前に, ボスはあなたにユーザー名が存在するかどうか、またはパスワードの性別を確認し、検証の波を実行することを望んでいます. 検証が完了した後、それは真/偽ではないかもしれません.ただし、文字列が返される可能性があります。オブジェクトが返される可能性がある場合、例外は情報を運ぶことができるため、例外が役割を果たすことになり、例外はサービス層での検証の直後にスローされる可能性があります。検証判定の処理が完了します。 !

コントローラー層で試す場合、各メソッドを試すのは明らかに冗長であるため、グローバルな例外処理が実行されます。

1.4.1: EduException ジェネリック例外クラス

 Service でカスタム例外を例外処理にスローする場合、どのように選択すればよいですか

カスタム例外: Exception コンパイル時例外、RuntimeException 実行時例外

コンパイル時例外はメソッドで宣言され、各呼び出し元がそれらを処理する必要があるため、ほとんどの場合、実行時例外が引き続き使用されます。問題!

実行時例外は、試してみると、システム自体が生成した例外なのか、取得時にカスタマイズした例外なのかわかりません。多くの実行時例外には広範囲が含まれており、独自の定義であるかどうかを区別するのは困難です。ランタイムはシステムによって生成されたランタイムのままですが、どうすればよいですか?

この問題を解決するには、ランタイム例外を継承してそのサブクラスを使用し、サブクラスを使用して独自のカスタム例外をスローします。これは良い解決策です。

コード例 

zx_common_practise でカスタム EduException 例外クラスを作成する

1.4.2: catch カスタム例外クラスを作成する

  • テスト: ビジネスの必要な位置で EduException をスローします。たとえば、クエリ リストのエラーです。

    @GetMapping
    @ApiOperation("查询所有老师")
    public BaseResult findAll(){
        if (true){
        //    throw new RuntimeException("我就是运行时异常");  
            //    如果按照这种进行抛出压根不知道是自定义的异常抛出还是系统的运行时异常抛出
            throw new EduException("我是自定义异常");
        }
        List<EduTeacher> list = eduTeacherService.list();
        return BaseResult.ok("查询成功",list);
    }
  • カスタム ハンドラー メソッドを GlobalExceptionHandler クラスに追加する

    @ExceptionHandler(EduException.class)
    public BaseResult error(EduException e){
        e.printStackTrace();
        return BaseResult.error(e.getMessage());
    }

1.4.3: 例外ツール クラス

 

このツールの目的は何ですか?

上記でカスタム例外をスローするには、新しい例外が必要です: 上記のように

この新しい例外のプロセスをツール クラスに抽出して、毎回再作成する必要がないようにします。

ツール クラスのメソッドを直接呼び出す

 

 ツール クラス: ソース コード

public class ExceptionUtils {
    /**
     * 抛出异常
     * @param message
     */
    public static void cast(String message) {
        throw new EduException(message);
    }
}

おすすめ

転載: blog.csdn.net/m0_64550837/article/details/126680226