7

のような論理エラー エラーに直面した場合(Expired user, invalid ID)、このエラーの親メソッドに次の情報を伝える最善の方法は何ですか。

1- 次のようなカスタマイズされた例外をスローします。

 try
{
//if (ID doesn't match) then 
Throw new CustomException(-1,"ID doesn't match");
}
catch(CustomException ex)
{
throw ex
}
catch(Exception ex)
{
throw new CustomException(ex.ErrorCode,ex.message);
}

2- エラー メッセージと次のようなコードを返します。

//if (ID doesn't match) then 
This.ErrorCode= -1;
This.Message= "ID doesn't match";
4

5 に答える 5

4

より良い方法は、カスタム例外をスローすることです。それが彼らが紹介された理由です。などの特定の情報を提供する必要がある場合は、基本クラスをErrorCode簡単に拡張して提供できます。Exception主な理由は次のとおりです。

  • 関数から返された無効なエラー コードを無視することができます。これにより、Exception無視できないシステム状態が破損する状況につながる可能性があります。
  • 関数が何か有用なことを行う場合、エラーコードではなく、関心のあるデータを返す必要があります。これにより、より堅実な設計が得られます。
于 2013-04-08T07:25:00.807 に答える
3

(期限切れのユーザー、無効な ID) などの論理エラー エラーが発生した場合、このエラーの親メソッドを伝える最善の方法は何ですか?

  1. 親メソッドにエラーを知らせたいので、メソッドを呼び出す前に、それIDが有効であり、有効期限が切れていないことがわかりません。右?UserGetUser

  2. 関数に渡すパラメーターが有効かどうかわからない場合は、例外を使用しても意味がなく、代わりにエラー情報を返す必要があります。

  3. Scala、Go、および Rust 言語が提案するものと同様に、より機能的な方法でエラー情報を返すことができます。

エラーまたは値を返すジェネリック クラスを作成する

public class Either(of ErrorType, ValueType)
    public readonly Success as boolean
    public readonly Error as ErrorType
    public readonly Value as ValueType

    public sub new(Error as ErrorType)
        me.Success = False
        me.Error = Error
    end sub

    public sub new(Value as ValueType)
        me.Success = True
        me.Value = Value
    end sub
end class

関数が持つ可能性のあるエラーの列挙を作成します

public enum UserError
    InvalidUserID
    UserExpired
end enum

ユーザー ID を引数として受け取り、エラーまたはユーザーを返す関数を作成します。

function GetUser(ID as integer) as Either(of UserError, User)

    if <business logic to find a user failed> then
        return new Either(of UserError, User)(UserError.InvalidUserID) 
    end if

    if <user expired> then
        return new Either(of UserError, User)(UserError.UserExpired)
    end if

    return new Either(of UserError, User)(User)
end function

呼び出し元 (親) メソッドでエラーをチェックし、ビジネス ロジックを適用します。

dim UserID = 10
dim UserResult = GetUser(10)

if UserResult.Success then
    rem apply business logic to UserResult.Value
else
    rem apply business logic to UserResult.Error
end if

注: 例外を使用してこのコードを書き直すと、まったく同じ量のコードが得られます。

于 2015-10-31T23:35:19.087 に答える
2

ほとんどの場合、例外をスローする必要があります。これが標準例外かカスタム例外かはコンテキストによって異なりますが、プロセスには関係ありません。

例外をスローすると、実装はそれに応じて不良データを処理するように強制されます。正しい処理のためにプロパティ値をチェックする実装に依存している場合、遅かれ早かれ、予期せず、デバッグが困難な例外が発生します。

于 2013-04-08T07:27:03.023 に答える
2

例外を使用する必要があると思います。例外が作成された理由は正確であるためです。2番目のケースと同じ情報をそこに置くことができます。しかし、1 番目と 2 番目の違いは、関数の消費者に何か問題があることを通知する可能性を与えることであり、何らかの方法で処理する必要があります。2 番目のケースでは、関数が機能したと言っているだけですが、何か問題があり、ユーザーはこの情報を処理する場合があります

于 2013-04-08T07:27:25.080 に答える