4

関数で、返されるはずのクラスのパラメーターの入力を開始するにはどうすればよいですか?例外が発生した場合は、代わりにエラークラスを返しますか?

public **** function()
    {
        try
        {
            Articles articles = new Articles();
            articles.articleid = 234;
            articles.articlename = "Milk";
            articles.deleted = 0;

            //continue fill Articles 
            //and an exception occurs


            return articles;

        }
        catch (Exception e)
        {
            Errors Error = new Errors();
            Error.exceptionmessage = e.Message;
            Error.exceptionname = e.ToString();
            Error.httpcode = 500;


            return Error;
        }
    }

これは可能で、良いことですか?または、null 値の割り当てで多くの情報を返す場合でも、すべての戻りクラスをエラー クラスで拡張する必要があります。できるだけ少ないデータを送信したいのですが、関数が失敗した場合はエラーを送り返します。

アップデート

私の状況について十分な情報を提供できなくて申し訳ありません。これは Web サービスで使用したい機能です。

[OperationContract]
    [WebGet(
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json)]
    **** Function();

だから私は例外をスローできるとは思わない。すべてが順調であれば記事のクラスを返したいので、データを JSON に変換する必要はありませんが、何か問題が発生した場合は、http コード 500 内部サーバー エラーをクライアントに送信したいと考えています。私はまだすべての回答を読んでいませんが、何かがうまくいかなかったときにクライアントができるように、エラークラスを他のすべての戻り値クラスに含める必要があると思いますか?

4

7 に答える 7

8

私はあなたが提案することをしないことを正直にアドバイスします。代わりに、既存のException型を使用するか、新しいサブクラスを作成してExceptionスローします。必要に応じて、原因となった例外情報を新しい例外に保持することもできInnerExceptionます。


ただし、状況が例外を保証しない場合 (何を行っているかについて十分な詳細を提供していない場合)、Resultエラー/警告情報を含むクラスを作成できます。ただし、この種のものは警告に適しています。つまり、処理の続行を妨げるエラー状態 (例外) ではなく、呼び出し元のコードが重大な副作用なしに無視することを選択できるメッセージです。

例えば:

class Result<T>
{
    public Result(T Value, Errors Errors = null)
    {
        this.Value = Value;
        this.Errors = Errors;
    }

    public T Value {get; private set;}

    public Errors Errors {get; private set;}
}

使用法(サンプルコードによる):

public Result<Articles> function()
{
    try
    {
        Articles articles = new Articles();
        articles.articleid = 234;
        articles.articlename = "Milk";
        articles.deleted = 0;

        //continue fill Articles 
        //and an exception occurs


        return new Result(articles);

    }
    catch (Exception e)
    {
        Errors Error = new Errors();
        Error.exceptionmessage = e.Message;
        Error.exceptionname = e.ToString();
        Error.httpcode = 500;


        return new Result<Articles>(null, Error);
    }
}
于 2013-07-17T08:03:33.397 に答える
1

共通の基本型または共通のインターフェイスがある場合は、それを使用しますclass1class2ただし、この場合、ラッパー クラスを作成して、次のように両方の結果の型をカプセル化できます。

class MethodResult<T>
{
    public T Result { get; private set; }
    public Errors Errors { get; private set; }

    public MethodResult(T result) { this.Result = result; }
    public MethodResult(Errors errors) { this.Errors = errors; }
}

public MethodResult<Articles> MyMethod()
{
    try
    {
        ... 
        return new MethodResult<Articles>(articles);
    }
    catch(Exception e)
    {
        ... 
        return new MethodResult<Articles>(errors);
    }
}
于 2013-07-17T08:03:54.030 に答える
1

質問の追加情報に照らして、これは WCF サービスであるため、次をスローできますWebFaultException

public Articles function()
{
    try
    {
        Articles articles = new Articles();
        articles.articleid = 234;
        articles.articlename = "Milk";
        articles.deleted = 0;

        //continue fill Articles 
        //and an exception occurs


        return articles;

    }
    catch (Exception e)
    {
        throw new WebFaultException(System.Net.HttpStatusCode.InternalServerError)
        {
            Message = e.Message
        };
    }
}
于 2013-07-17T09:08:11.327 に答える
0

outキーワードを試すことができます。

public Articles function(out Error err)
    {
        Articles articles = null;
        err = null;
        try
        {
            articles = new Articles();
            articles.articleid = 234;
            articles.articlename = "Milk";
            articles.deleted = 0;
            // Set your article values

        }
        catch (Exception e)
        {
            Errors ex = new Errors();
            ex.exceptionmessage = e.Message;
            ex.exceptionname = e.ToString();
            ex.httpcode = 500;

            err = ex;
        }
        return articles;
    }
于 2013-07-17T08:00:54.830 に答える
-1

なぜ例外を飲み込みたいのかわかりませんが、この動作を行う場合は、両方の型に共通の戻り値の型を作成します。どちらのクラスも object から継承するため、メソッドのシグネチャを次のように変更できます。public object function()

于 2013-07-17T08:03:36.327 に答える