(期限切れのユーザー、無効な ID) などの論理エラー エラーが発生した場合、このエラーの親メソッドを伝える最善の方法は何ですか?
親メソッドにエラーを知らせたいので、メソッドを呼び出す前に、それID
が有効であり、有効期限が切れていないことがわかりません。右?User
GetUser
関数に渡すパラメーターが有効かどうかわからない場合は、例外を使用しても意味がなく、代わりにエラー情報を返す必要があります。
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
注: 例外を使用してこのコードを書き直すと、まったく同じ量のコードが得られます。