マイクロサービス アーキテクチャで例外を正しく使用する方法
この記事では、マイクロサービス アーキテクチャにおける例外の正しい使用方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
例外の正しい使用法は、マイクロサービス アーキテクチャにおける重要性のトップ 3 にランクされます。コメントはありません。
#例外の正しい使用法例外の数 マイクロサービス アーキテクチャの重要性でトップ 3 にランクされています。 コメントはありません。
Curdboys さん、お久しぶりです。端午節が楽しく過ごせることを祈っています。最近例外について話したいと思います。私の思考が閉ループを形成しているように思えます。この組み合わせがあなたのビジネス コードに役立つことを願っています。
以下では、世界で最も優れた言語と、環境的に最も完全な言語についてのみ説明します。私には意見はありません。
例外の類似点と相違点
PHP PHP7 の例外の設計は Java の Exception extends Throwable と一致していますが、歴史的な理由と設計にはまだ微妙な違いがいくつかあります。コンセプト。たとえば、PHP の例外にはコード属性があるため、複数の例外が同じ例外にクラスター化され、catch ブロック内のコードに応じて異なるビジネス ロジック コードが記述されます。
しかし、Java 例外にはコードがないため、このように設計することはできません。異なる例外は、異なる状況にのみ使用できます。したがって、私たちは、外部に公開されるときに、例外の透過的な送信に直接依存するのではなく、パッケージ化クラスを通じてサービスをカプセル化することに慣れています。
均一な例外処理
Java コードで最も批判されるのは、多数のトライ キャッチです。私には異論はありません。コードの一部を取得するだけです
@Override public DataResult<List<AdsDTO>> getAds(Integer liveId) { try { List<AdsDTO> adsDTO = new ArrayList<>(); //...业务逻辑省略 DataResult.success(adsDTO); } catch (Exception e) { log.error("getAds has Exception:{}", e.getMessage(), e); DataResult.failure(ResultCode.CODE_INTERNAL_ERROR, e.getMessage()); // 将异常信息返回给服务端调用方 } return dataResult; }
多くの場合、実行時以外の例外があるかどうかに関係なく、何も考えずに try catch を書くだけです。より良い方法は、aop を使用してすべてのサービス メソッド呼び出しをインターセプトし、例外を一律に引き継いで処理することです。
@Around("recordLog()") public Object record(ProceedingJoinPoint joinPoint) throws Throwable { //... 请求调用来源记录 Object result; try { result = joinPoint.proceed(joinPoint.getArgs()); } catch (Exception e) { //... 记录异常日志 DataResult<Object> res = DataResult.failure(ResultCode.CODE_INTERNAL_ERROR, e.getMessage()); result = res; } //... 返回值日志记录 return result; }
小さな問題があります。サービス A の例外情報を呼び出し元 B に直接返すと、潜在的なリスクが生じる可能性があります。呼び出し元は、たとえ貧困 3 世であっても、決して信頼できません。農民です。呼び出し元がエラー メッセージをどのように処理するかが不明なため、json としてフロント エンドに直接返される可能性があります。
RuntimeException
Java の例外は、実行時例外と非実行時例外に分類できます。実行時例外はキャッチする必要も、キャッチする必要もありません。たとえば、メソッド内で guava パッケージの Preconditions ツール クラスを使用する場合、スローされる IllegalArgumentException も実行時例外になります。
@Override public DataResult<List<AdsDTO>> getAds(Integer liveId) { Preconditions.checkArgument(null != liveId, "liveIds not be null"); List<AdsDTO> adsDTOS = new ArrayList<>(); //...业务逻辑省略 return DataResult.success(adsDTOS); }
この機能を使用して、独自のビジネス例外クラスをカスタマイズして RuntimeException を継承することもできます
XXServiceRuntimeException extends RuntimeException
ビジネス ロジックに準拠しない状況では、XXServiceRuntimeException が直接スローされます
@Override public DataResult<List<AdsDTO>> getAds(Integer liveId) { if (null == liveId) { throw new XXServiceRuntimeException("liveId can't be null"); } List<AdsDTO> adsDTOS = new ArrayList<>(); //...业务逻辑省略 return DataResult.success(adsDTOS); }
そして、aop では統合処理が実行され、対応する最適化が行われます。前述の大まかなアプローチでは、XXServiceRuntimeException と IllegalArgumentException 以外の例外は内部的に記録され、外部に公開されなくなります。ただし、分散リンクを 1 つにまとめることを忘れないでください。 requestId.In DataResult トラブルシューティングを容易にするために戻ります。
@Around("recordLog()") public Object record(ProceedingJoinPoint joinPoint) throws Throwable { //... 请求调用来源记录 Object result; try { result = joinPoint.proceed(joinPoint.getArgs()); } catch (Exception e) { //... 记录异常日志① log.error("{}#{}, exception:{}:", clazzSimpleName, methodName, e.getClass().getSimpleName(), e); DataResult<Object> res = DataResult.failure(ResultCode.CODE_INTERNAL_ERROR); if (e instanceof XXServiceRuntimeException || e instanceof IllegalArgumentException) { res.setMessage(e.getMessage()); } result = res; } if (result instanceof DataResult) { ((DataResult) result).setRequestId(EagleEye.getTraceId()); // DMC } //... 返回值日志记录 return result; }
異常監視
閉ループに関しては、カスタム例外クラスを使用すると、異常ログの監視と警告のしきい値を大幅に下げることができます。アラーム より正確には、Alibaba Cloud SLS の監視を例に挙げます。
* and ERROR not XXServiceRuntimeException not IllegalArgumentException|SELECT COUNT(*) AS count
ここで監視されるのは、例外ログを記録するログです。①
PHP の例外
Java で前述した問題は PHP にも存在します。AOP をシミュレートするために 3 つのメソッドを使用しない場合、PHP が世界で最高の言語であることを反映することはできません。//1. call_user_func_array //2. 反射 //3. 直接 new try { $class = new $className(); $result = $class->$methodName(); } catch (\Throwable $e) { //...略 }
function foo(){ return boo("xxx"); } function boo($a){ return explode($a); } foo();
Warning: explode() expects at least 2 parameters, 1 given in /Users/mengkang/Downloads/ab.php on line 8
set_error_handler(function ($severity, $message, $file, $line) { throw new ErrorException($message, 10001, $severity, $file, $line); }); function foo(){ return boo("xxx"); } function boo($a){ return explode($a); } try{ foo(); }catch(Exception $e){ echo $e->getTraceAsString(); }
Fatal error: Uncaught ErrorException: explode() expects at least 2 parameters, 1 given in /Users/mengkang/Downloads/ab.php:12 Stack trace: #0 [internal function]: {closure}(2, 'explode() expec...', '/Users/mengkang...', 12, Array) #1 /Users/mengkang/Downloads/ab.php(12): explode('xxx') #2 /Users/mengkang/Downloads/ab.php(8): boo('xxx') #3 /Users/mengkang/Downloads/ab.php(15): foo() #4 {main} thrown in /Users/mengkang/Downloads/ab.php on line 12
function boo(array $a){ return implode(",", $a); }
class Error は Throwable を実装しており、PHP システム エラー ログには Stack が存在しますが、ビジネス システム全体と直列に接続することはできません。ここでは、ログの設計について説明する必要があります。 Java のようなトレース ID。Nginx ログから PHP の通常の情報レベルのログ、およびこれらの Uncaught TypeErrors まで、すべてのログが連結されるため、デフォルトの出力はシステム エラー ログに引き継がれ、catch コード ブロック内の統一された場所に記録されます。次に、ここを
set_error_handler(function ($severity, $message, $file, $line) { throw new ErrorException($message, 10001, $severity, $file, $line); }); function foo(){ return boo("xxx"); } function boo(array $a){ return implode(",", $a); } try{ foo(); }catch(Throwable $e){ echo $e->getTraceAsString(); }
值得注意的是register_shutdown_function的用意是在脚本正常退出或显示调用exit时,执行注册的函数。
是脚本运行(run-time not parse-time)出错退出时,才能使用。如果在调用register_shutdown_function的同一文件的里面有语法错误,是无法注册的,但是我们项目一般都是分多个文件的,这样就其他文件里有语法错误,也能捕获了
register_shutdown_function(function(){ $e = error_get_last(); if ($e){ throw new \ErrorException($e["message"], 10002, E_ERROR, $e["file"], $e["line"]); } });
如果你想直接使用这些代码(PHP的)直接到项目可能会有很多坑,因为我们习惯了系统中有很多 notice 了,可以将 notice 的错误转成异常之后主动记录,但是不对外抛出异常即可。
推荐学习:php视频教程
以上がマイクロサービス アーキテクチャで例外を正しく使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

PHP8では、一致式は、式の値に基づいて異なる結果を返す新しい制御構造です。 1)Switchステートメントに似ていますが、実行ステートメントブロックの代わりに値を返します。 2)一致式の式は厳密に比較され、セキュリティが向上します。 3)スイッチステートメントの脱落の可能性を回避し、コードのシンプルさと読みやすさを向上させます。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
