2

.net では、サブクラスを作成する人に、基本クラスがスローする可能性のある特定の例外の種類をコーディングする必要があることを認識させるにはどうすればよいですか? 理想的には、開発者に例外をキャッチするか、例外が発生する前に必要な検証を実行するように強制することを検討しています...属性を使用して、開発者に例外のコーディングを強制することはできますか?

例えば....

「保存」メソッドを呼び出すコードがいくつかあります。オブジェクトで save が呼び出される前に、いくつかの検証を提供するインターセプト クラスがあります。クラスが有効な状態にない場合、例外をスローします (私が見ているのは私のコードではないため、この時点で例外を使用しないことは受け入れられる解決策ではありません...)、私が疑問に思っているのはコードの消費者に、潜在的な例外をチェックしてコーディングするか、少なくとも例外が発生しないようにチェックを実行する必要があることをどのように明確にしますか...?

簡単に言えば(私のコードは多くのインターフェースなどを使用しているため、これは単なる例です...)

class SavableObject {
    public static void Save(){
        // validation
        ValidationClass.BeforeSave();
        // then do the save... 
        DoSave();
    }
    public static void DoSave(){
        // serialize...
    }
}

class ValidationClass {
    public static void BeforeSave(T cls){
        // perform some checks on class T
        // THROW EXCEPTION if checks fail
    }
}

したがって、この例では、コードのコンシューマーは次のように SavableObject から継承し、save を呼び出すことができます...例...

class NewSavableThing: SavableObject
{
    public static void Save(){
        base.Save();
        // calls inherited save method which may throw an exception
        // At this point the exception may still occur, and the person writing this 
        // code may not know that the exception will occur, so the question is how do 
        // I make this clear or force the developer of this class to code for 
        // the possibility that the exception may occur?!
    }
}

サブクラスを構築する人に例外のコーディングを強制できるように、一連の属性を使用できるかどうか疑問に思っています...例...

class SavableObject {
    [DeveloperMustCatchException(T)] // specifies that the exception type must be caught
    public static void Save(){ ... }
}


class NewSaveableThing: SavableObject {
    [ExceptionIgnored] / [ExceptionCaught] // specifies that the developer is aware 
    // that the exception needs catching/dealing with, I am assuming that 
    // if this attribute is not provided then the compiler will catch 
    // and prevent a successful compile...
    public static void Save() {
    }
}

どんなポインタでも大歓迎です...

編集:明確にするために-開発者が例外を知らないように、開発者に例外が存在することを認めさせたいと思います。理想的には、[ExceptionIgnored] 属性または [ExceptionHandled] (または同様の) 属性が欠落している場合、コンパイラはコンパイルを停止します...これは、例外が考慮されたことを示します。例外が無視されてもかまいません。私がやろうとしているのは、次の開発者が例外の存在を認識していることを確認することです-それが理にかなっている場合. /// コメントで例外を文書化できることを知っています...

例外が文書化されていても、例外を認識しておらず、すべての文書を読んでいない学生が私たちと一緒に働いているので、私は尋ねます。私は彼らが書いたコードのすべての行をチェックすることはできないので、彼らに例外を認めさせ、例外が考慮されていることをコンパイラにチェックさせたいと思っていました.その存在に気づき…

4

4 に答える 4

4

XML ドキュメント (///メソッド ヘッダーのコメント)、具体的には例外タグを使用します。

タグを使用すると、スローできる例外を指定できます。

例外が発生する可能性があることを人々に知らせるだけで十分です。彼らはそれを捕まえるか、エスカレートさせるかを決めることができます。

編集

実際、Java のthrowsキーワードが必要です。残念ながら、C# には存在しません。

于 2012-08-25T18:26:55.860 に答える
1

開発者は、コード内で例外をキャッチして処理することを強いられるべきではありません。コードが例外の原因から合理的に回復できない場合は、キャッチされるべきではなく、例外が発生するはずです。

于 2012-08-25T18:25:35.537 に答える
1

あなたが求めていることをコンパイラに実行させる方法はありません。コンパイラにオブジェクトの状態の正確性をチェックさせる最も近い方法は、コード コントラクトhttp://msdn.microsoft.com/en-us/library/dd264808.aspxを使用することです。

于 2012-08-25T18:51:20.807 に答える
1

このケースを処理する最もクリーンな方法は、テンプレート メソッドを使用して保存を行い、サブクラスが例外がスローされた場合にエラー ハンドラーの実装を提供することを要求することだと思います。

public abstract class SaveableObject
{
    public void Save()
    {
        try
        {
            ValidationClass.BeforeSave();
            this.SaveCore();
        }
        catch(ExceptionType ex)
        {
            OnSaveException(ex);
        }
    }

    protected abstract void OnSaveException(ExceptionType ex);
    protected abstract void SaveCore();
}
于 2012-08-25T19:01:24.793 に答える