集約エラーハンドラーの実装⚓︎
本章では、 SSR ベースの Blazor Server アプリケーションにおける集約エラーハンドラーの構成と実装手順を解説します。 本章の手順を実施することで、 本番環境で Blazor ランタイムおよび .NET ランタイム内でシステム例外が発生した場合、エラーページに遷移する機能が実装されます。
システム例外の処理方針については、全体処理方式 - 例外処理方針 を参照してください。
集約エラーハンドリングの全体像⚓︎
本章では、次の内容を実施します。
- Blazor ランタイム内で発生した未処理例外を表示するコンポーネント( Error.razor )を実装します。
ErrorBoundaryでError.razorを囲むようにレイアウトします。- .NET ランタイム( Blazor 起動前)で発生した例外を表示する Razor Pages ベースのエラーページ ( ServerError.cshtml )を実装します。
- エントリーポイント( Program.cs )で、上記のエラーハンドリングを有効にするための設定をします。
プロジェクトの作成 で作成した Fluent Blazor Web アプリのテンプレートから変更すべき点は、以下の通りです。
├ {ApplicationName}.Web
├ Components
│ ├ Layout
│ │ └ MainLayout.razor ............ 変更します。
│ ├ Pages
│ │ ├ Error.razor ................... 変更します。
│ │ └ Error.razor.css ............... 追加します。
│ └ _imports.razor .................. 変更します。
├ Pages
│ └ ServerError.cshtml ............ 追加します。
└ Program.cs ........................ 変更します。
レイアウトの変更⚓︎
このセクションでは、アプリケーションの共通レイアウト(MainLayout.razor)を変更し、 Blazor ランタイム内の未処理例外を集約して扱う方法を説明します。
MainLayout.razor を次のように修正し、エラー境界を導入します。 このことにより、子コンポーネントで発生した未処理例外をまとめてキャッチし、エラーページの表示やエラー後の回復処理を一元化します。
- MainLayout.razor のビューに ErrorBoundary コンポーネントを追加します。
| MainLayout.razorの変更点(抜粋) | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
@codeブロックを追加します。OnParametersSet()のタイミングでRecover()処理をすることで、エラー状態から通常の状態へ復旧するように仕込んでいます。
| MainLayout.razor に追加する @code ブロック | |
|---|---|
1 2 3 4 5 6 7 8 | |
ErrorBoundary コンポーネントの詳細については、ASP.NET Core Blazor アプリのエラーを処理する - エラー境界 を参照してください。
エラーコンポーネントの設定⚓︎
このセクションでは、 Blazor ランタイム内の未処理例外をユーザーに表示するためのコンポーネント Error.razor の実装方針を説明します。 開発環境でのデバッグ効率を高めるため、 Exception のスタックトレースの情報を表示するように実装します。
Error.razor の実装例を下記に示します。 開発者が扱いやすいように、トップページへのリンク機能とスタックトレースの表示機能を実装しています。 開発環境かつ例外の情報がある場合にのみ、スタックトレースを表示します。
| サンプルアプリケーションの Error.razor | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | |
エラーページの実装⚓︎
.NET ランタイム側で発生した例外を扱うためのエラーページを追加します。 Blazor の起動前にエラーをキャッチする必要があるので、 Razor Components ではなく、 Razor Pages( .cshtml )として実装します。 Razor Pages のファイルは、 Razor Components を格納する Pages フォルダーとは異なるプロジェクトルート直下の Pages フォルダー内に必ず作成してください。
注意:Razor Pages と Razor Components
Razor Pages はページ指向のアーキテクチャーを採用している一方で、Razor Components はコンポーネント指向のアーキテクチャーを採用しています。そのため、 Razor Pages では、 1つの URL に対して 1つのページ( .cshtml )が対応することが想定されています。よって、 Razor Pages を用いる場合、 URL に紐づくファイル名およびパスは Pages フォルダ配下のフォルダー階層によって決定されるので、異なる場所に配置しないよう注意してください。Razor Pages についての詳細な解説は、Razor ASP.NET Core のページのアーキテクチャと概念 を参照してください。
├ {ApplicationName}.Web
├ Components
│ ├ Pages
│ │ │ Error.razor
│ │ └ ServerError.cshtml --- NG
├ Pages
└ └ ServerError.cshtml --- OK
下記にエラーページの実装例を示します。
エラーページの実装例
| サンプルアプリケーションの ServerError.cshtml | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | |
エントリーポイントの設定⚓︎
Razor Pages として追加した ServerError.cshtml を動作させるため、 エントリーポイントで Razor Pages 関連の設定をします。 Program.cs を下記のように変更します。
| Program.cs の変更点(抜粋) | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | |
動作確認⚓︎
Blazor ランタイムの例外の確認⚓︎
Home.razor に下記のようにわざと例外を発生させる @code ブロックを実装し、アプリケーションを起動します。
| 例外を発生させる Home.razor | |
|---|---|
1 2 3 4 5 6 7 8 | |
アプリケーションの起動と同時に、 Error.razor のページが表示され、内部サーバーエラーを示すメッセージと、例外のスタックトレースが表示されることを確認してください。 確認ができたら、確認用に追加したコードは削除してください。
.NET ランタイムの例外の確認⚓︎
NavMenu.razor に下記のようにわざと例外を発生させる @code ブロックを実装し、アプリケーションを起動します。
| 例外を発生させる NavMenu.razor | |
|---|---|
1 2 3 4 5 6 7 8 9 | |
アプリケーションの起動と同時に、「 An unhandled exception occurred while processing the request. 」ともに詳細なエラー情報を示す画面に遷移することを確認して下さい。 確認ができたら、確認用に追加したコードは削除してください。
また、本番環境用のエラーページ ServerError.cshtml には、アドレスバーに直接 /ServerError を打ち込むことで遷移可能です。 こちらのページはエラー発生時にユーザーが閲覧することを想定しているので、詳細なエラー情報を表示しません。