1

私はあなたのアドバイスを必要とします。ソース アプリケーションが非常に拡張されました。そして、エラーや例外などの処理に少し問題があります..

たとえば、dbに接続するメソッドがある「DatabaseProvider」クラスがあります。標準例外、無効なデータ フォーム データベース (間違った電子メール形式など)、データベースから返されたエラーに対処する必要があります。DatabaseProvider のメソッドを呼び出した関数に戻す必要があるすべてのものは、そのメソッドがこの例外またはエラーをログに記録し、引き続き機能するようにします。だから私は例外をスローすることはできません。

それでも十分でない場合は、ほとんどの場合、値またはオブジェクトまたはオブジェクトのリストを (DatabaseProvider から) 返す必要があります。

それで、「Response」クラスを作成するかもしれないと思いました。そのクラスのオブジェクトは、アプリのすべてのメソッドから返されます。

そのようなもの:

public class Response
{
    public bool Error { get; set; }
    public string ErrorMessage { get; set; }        
    public bool DatabaseError { get; set; }
    public string DatabaseMessage { get; set; }

    public Exception ex { get; set; }
}

しかし、(たとえば) 自己設計オブジェクトのリストを同時に返す方法は?

「out」パラメータを使用することは解決策ですか? 最善の方法 (ベスト プラクティス) は何ですか? 私はそれについて検索していましたが、私が見つけたのは例外の処理方法だけでした..

4

2 に答える 2

4

例外が発生した場合に渡す必要があるすべてのデータを含むカスタム例外を実装します。何かのようなもの

public class MySpecificException: Exception
{
    public bool Error { get; set; }
    public string ErrorMessage { get; set; }        
    public bool DatabaseError { get; set; }
    public string DatabaseMessage { get; set; }

    public Exception ex { get; set; }
}

例外をスローし、呼び出し元の関数で特定の例外に対して try catch ブロックを使用します。

public void CallingFunction()
{
    try {
        //call your function
    }
    catch (MySpecificException ex) 
    {
        //log the data from the exception
    }

それがまさにカスタム例外の目的です。

このようにして、関数から返したいもの(リストなど)を返すことができます。

于 2011-07-30T03:09:59.213 に答える
3

非常にエラー固有のように見えるため、この情報を返すのではなく、スローしてキャッチできるカスタム例外を実装することをお勧めします。

ただし、返された結果に特定のメタ情報を常に添付したい場合は、小さな車両クラスを実装して、メタ情報を保持しながら結果をラップすることができます。

abstract class ResultWrapper
{
    //meta info, such as error references/properties/flags/statistics

    public ResultWrapper([meta info])
    {
        //set meta info
    }
}

class ResultList<T> : ResultWrapper
{
    public readonly List<T> resultList;

    //constructor for resultList, plus meta information for parent
    public ResultList(List<T> resultList, [additional args for meta info]) : base([meta info])
    {
        this.resultList = resultList;
    }
}

class SingleResult<T> : ResultWrapper
{
    public readonly T result;

    //constructor similar to above
}

編集:コメントに基づいて、スローできるカスタム例外を必ず使用する必要があります(ラッピングにより例外が発生する可能性があります)。Petar が言ったように、これらはループ内でキャッチされ、後続のタスクの実行を停止することなくそこで処理されます。この言語は正当な理由で例外処理をサポートしています - 私はそれを利用します。

また、あなたのパターンでfyi:

public bool Error { get; set; }
public string ErrorMessage { get; set; }

の必要はありませんbool。エラーメッセージ/参照フィールドでnullでないことを確認するだけです

于 2011-07-30T03:04:26.100 に答える