2013-04-08 10 views
6

顔論理エラーエラーなど(Expired user, invalid ID)が、次からこのエラーの親メソッド伝えるための最善の方法どのような場合には:関数からエラーメッセージを返す最良の方法は何ですか?

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:次のようにカスタマイズされた例外をスロー

1- - エラーメッセージとコードを返します。

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

**試し**、**キャッチ**、**投げ**、最初のものは最高です.. – NetStarter

+1

[この質問を見る](http://stackoverflow.com/questions/3926086/handling-既知のエラーおよびエラーメッセージの方法?rq = 1)。 –

+0

私は今なぜですか? –

答えて

2

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

  • 無効なエラーコードがあなたのfuncionから返されると、これはExceptionはあなたが無視できないものであるのに対し、システムの状態が破損している状況にあなたを導く可能性が無視できます。
  • あなたの機能が何か役に立ったら、エラーコードではなく興味のあるデータを返さなければなりません。
1

ほとんどの場合、例外をスローする必要があります。これが標準またはカスタムの例外であるかどうかは、コンテキストに依存しますが、プロセスとは関係ありません。

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

2

例外を使用する必要があると思います。なぜなら、それらは何のために作られたのかということです。 2番目のケースと同じ情報をそこに置くことができます。しかし、1位と2位の違いは、関数の消費者に何か間違ったことを知らせる可能性があることです。MUSTどうにかして処理する必要があります。 2番目のケースでは、機能は機能していますが、何か間違っていると言います。MAYこの情報を処理します。

0

これはプロジェクトのワークフローによって異なります。予期しない実行タイマーエラーであり、プログラムを禁止する場合は例外ですが、簡単な入力チェックと期待できる出力には列挙子を使用する必要があります。

1

エラーが発生しました

  1. このエラーの親方法を伝えるための最善の方法あなたが親メソッドがエラーを知りたいされているのでどのような)、そして、それはあなたがIDが有効であるとUserことを確認していないことを縫い目GetUserメソッドを呼び出す前に期限切れになっていません。右?

  2. 関数に渡すパラメータが有効かどうかわからない場合は、例外を使用することは正当ではないため、代わりにエラー情報を返す必要があります。

  3. エラー情報は、Scala、Go、Rustの言語に似た、より機能的な方法で返すことができます。

関数が

public enum UserError 
    InvalidUserID 
    UserExpired 
end enum 

がユーザーをとる関数を作成することができ、エラーの列挙を作成してエラーまたは値

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 

のいずれかを返すために、一般的なクラスを作成します。 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 

注意を適用する:あなたは正確に同じコードの量を取得する例外を使用してこのコードを書き換える場合。

関連する問題