📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| 49行目: | 49行目: | ||
==== 例外クラスの作成 ==== | ==== 例外クラスの作成 ==== | ||
以下の例では、例外クラスを作成している。<br> | 以下の例では、例外クラスを作成している。<br> | ||
例外クラスは、<code>System.Exception</code>クラスを継承して作成する。<br> | |||
<br> | <br> | ||
以下の例のように、4つのコンストラクタは、与えられた引数を基底クラス(<code>System.Exception</code>クラス)のコンストラクタに渡す。<br> | |||
<br> | <br> | ||
3番目のコンストラクタは、例外メッセージと共に、例外の原因となる別の例外への参照を<code>innerException</code>に設定して、 | * 基本の3つのコンストラクタを実装 | ||
例外クラスのインスタンスを初期化するためのものである。<br> | *: 3番目のコンストラクタは、例外メッセージと共に、例外の原因となる別の例外への参照を<code>innerException</code>に設定して、 | ||
*: 例外クラスのインスタンスを初期化するためのものである。 | |||
<code>SerializableAttribute</code>属性と4番目のコンストラクタにより、例外クラスは、ソフトウェアのドメイン境界を越えることができる。<br> | *: <br> | ||
<code>SerializableAttribute</code>属性がある全てのクラスは、フォーマッタを使用してシリアル化が可能になる。<br> | * 例外クラスのシリアル化対応 | ||
特に、例外クラスに<code>SerializableAttribute</code>属性がある場合、例外がソフトウェアのドメイン境界を超える時、必要に応じて自動的にシリアル化を行う。<br> | *: <code>SerializableAttribute</code>属性と4番目のコンストラクタにより、例外クラスは、ソフトウェアのドメイン境界を越えることができる。<br> | ||
<br> | *: <code>SerializableAttribute</code>属性がある全てのクラスは、フォーマッタを使用してシリアル化が可能になる。<br> | ||
*: 特に、例外クラスに<code>SerializableAttribute</code>属性がある場合、例外がソフトウェアのドメイン境界を超える時、必要に応じて自動的にシリアル化を行う。<br> | |||
*: <br> | |||
これを行うのが、4番目のコンストラクタとなる。<br> | *: シリアル化されて、別のソフトウェアのドメインからスローされた例外オブジェクトを正しく受け取るためには、元の例外オブジェクトに戻す必要がある。 | ||
<br> | *: これを、逆シリアル化と呼ぶ。<br> | ||
4番目のコンストラクタは、フォーマッタが呼び出すために存在するため、設計者が明示的に呼び出すことはない。<br> | *: これを行うのが、4番目のコンストラクタとなる。<br> | ||
また、呼び出されることを避けるため、<code>protected</code>修飾子を付加する。(フォーマッタは、アクセス修飾子に関係なく呼び出すことができる)<br> | *: <br> | ||
<br> | *: 4番目のコンストラクタは、フォーマッタが呼び出すために存在するため、設計者が明示的に呼び出すことはない。<br> | ||
逆シリアル化コンストラクタが<code>public</code>修飾子の場合、任意のコードから不正なデータを渡して例外クラスのインスタンスを生成できる。<br> | *: また、呼び出されることを避けるため、<code>protected</code>修飾子を付加する。(フォーマッタは、アクセス修飾子に関係なく呼び出すことができる)<br> | ||
*: <br> | |||
*: 逆シリアル化コンストラクタが<code>public</code>修飾子の場合、任意のコードから不正なデータを渡して例外クラスのインスタンスを生成できる。<br> | |||
*: また、例外クラスの継承を禁止する(<code>sealed</code>修飾子を付加する)場合は、逆シリアル化コンストラクタに<code>private</code>修飾子を付加することもできる。<br> | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
using System; | using System; | ||