📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

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