re:デザインのカスタム例外:なければいけませ実施し、デフォルトのコンストラクタ?の"内部例外"は、例外をコンストラクタ?
-
21-08-2019 - |
質問
その答えを 何が正しい例外的に直列化可能? というのは"正しい"のベース実装のためのカスタム例外を含む4ctors:
[Serializable]
public class SerializableExceptionWithoutCustomProperties : Exception
{
public SerializableExceptionWithoutCustomProperties()
{
}
public SerializableExceptionWithoutCustomProperties(string message)
: base(message)
{
}
public SerializableExceptionWithoutCustomProperties(string message, Exception innerException)
: base(message, innerException)
{
}
// Without this constructor, deserialization will fail
protected SerializableExceptionWithoutCustomProperties(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}
の意したと思いことになる良い名前の例外タイプです。でも、その向こうに
目的のバイナリーの直列化は、何を質問したり、 なければいけませ実施す4つの全てのコンストラクタ?この目的の[直列化してきましたのでなければなctorを受け入れる2つの引数の型(SerializationInfo,StreamingContext)での例外からのシステム。例外は、自身がカスタム直列化します。内容を理解することができます。がなければいけませ実施、その他のctors, るために適切に提供す直列化可能でない例外?知っているしたい場合はをタイプするxmlベースの直列化が必要なのですが、デフォルト(op)ctor.は同様にtrue[直列化可能]?一瞬にしましょう閉じ込め、自分の狭い懸念[直列化可能でない]に残して何より幅広いガイドラインに関する枠組み"をすることができます。
への移動により幅広い問題: のガイドラインと言う その カスタム例外で実装すべき4つの共通ctors.の背後にあるこのガイドライン"って何ですか?いデザインのカスタム例外では非常に悪いマナーやバグがないをnullに初期ctor?で非常に悪いマナー、またはバグではない、提供ctorが可能innerException?なぜですか?検討の場合は私のカスタム例外が発生する内マイライブラリコード、インスタンスからスローなどのメッセージ、innerException.
では、次のコード可能のためのカスタム例外を提供する追加。
[Serializable]
public class CustomException : Exception
{
public CustomException(string message) : base(message) { }
// Without this constructor, deserialization will fail
protected CustomException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
}
解決 4
私は、答えのいずれかを好きではなかったです。私は、デフォルトコンストラクタとネストされたコンストラクタを含め、私のカスタム例外の「通常」のコンストラクタをなくすことができること...である私の提案したソリューション、上セトリングしています。また、私はので、クロスのAppDomain呼び出しの確認シリアル化の作品を、確認する必要があります。
他のヒント
関連コード分析の警告はCA1032で、リファレンス・ページこの正当化を提供します:
のフルセットを提供するために、失敗 コンストラクタはにそれを困難にすることができます 正しく例外を処理します。ために たとえば、とコンストラクタ 署名NewException(文字列、 例外)を作成するために使用されます その他によって引き起こされた例外 例外。このコンストラクタがなければ、 あなたが作成して投げることができません そのカスタム例外のインスタンス インナー(ネスト)例外が含まれ、 コードが何をすべき管理何これは このような状況インチ最初の3 例外コンストラクタはによって公開されています コンベンション。第四コンストラクタがあります 密封されていないクラスで保護され、 密閉されたクラスの私立ます。
あなたの状況が例外を保証されている場合のみ、あなたやあなたのプロジェクトチームを決めることができます(すみません...)
ねえ、私はそれは、少なくともMicrosoftがお勧めだということを知っています。あなたはVS2008(または多分それ以前のバージョン)を使用する場合は、簡単に入力することにより、Visual Studioがあなたのためにそれらを作成させることができます。
exception
エディタで開き、Tabキーを押す(2回?)。これは、クラスに新しい名前を与えるために、あなたにチャンスを与え、それらを作成します。
提案:他の人があなたの例外を使用すると、これらの他の人ので、.NETの例外に精通しているであろうあれば、なぜだけでなく、ガイドラインに従ってください?彼らは、.NET Frameworkによって使用されているものと同じです。
あなたが定義しているカスタム例外タイプの数を考えると、これはあまりにも多くの仕事で感じていますか?もしそうなら、これはあなたがカスタム例外を多数作成しないように指定ガイドラインに従うために別の理由だろう。