50行目: 50行目:
以下の例では、例外クラスを作成している。<br>
以下の例では、例外クラスを作成している。<br>
<br>
<br>
例外クラスは、System.Exceptionクラスを継承する。<br>
例外クラスは、<code>System.Exception</code>クラスを継承する。<br>
4つのコンストラクタは、与えられた引数を基底クラス(System.Exceptionクラス)のコンストラクタに渡す。<br>
4つのコンストラクタは、与えられた引数を基底クラス(<code>System.Exception</code>クラス)のコンストラクタに渡す。<br>
<br>
<br>
3番目のコンストラクタは、例外メッセージと共に、例外の原因となる別の例外への参照をinnerExceptionに設定して、<br>
3番目のコンストラクタは、例外メッセージと共に、例外の原因となる別の例外への参照を<code>innerException</code>に設定して、<br>
例外クラスのインスタンスを初期化するためのものである。<br>
例外クラスのインスタンスを初期化するためのものである。<br>
<br>
<br>
SerializableAttribute属性と4番目のコンストラクタにより、例外クラスは、ソフトウェアのドメイン境界を越えることができる。<br>
<code>SerializableAttribute</code>属性と4番目のコンストラクタにより、例外クラスは、ソフトウェアのドメイン境界を越えることができる。<br>
SerializableAttribute属性がある全てのクラスは、フォーマッタを使用してシリアル化が可能になる。<br>
<code>SerializableAttribute</code>属性がある全てのクラスは、フォーマッタを使用してシリアル化が可能になる。<br>
特に、例外クラスにSerializableAttribute属性がある場合、例外がソフトウェアのドメイン境界を超える時、必要に応じて自動的にシリアル化を行う。<br>
特に、例外クラスに<code>SerializableAttribute</code>属性がある場合、例外がソフトウェアのドメイン境界を超える時、必要に応じて自動的にシリアル化を行う。<br>
<br>
<br>
シリアル化されて、別のソフトウェアのドメインからスローされた例外オブジェクトを正しく受け取るためには、<br>
シリアル化されて、別のソフトウェアのドメインからスローされた例外オブジェクトを正しく受け取るためには、<br>
65行目: 65行目:
<br>
<br>
4番目のコンストラクタは、フォーマッタが呼び出すために存在するため、設計者が明示的に呼び出すことはない。<br>
4番目のコンストラクタは、フォーマッタが呼び出すために存在するため、設計者が明示的に呼び出すことはない。<br>
呼び出されると困るため、アクセス修飾子をprotectedに設定する。(フォーマッタは、アクセス修飾子に関係なく呼び出すことができる)<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;