2011-03-06 3 views
0

これは、エラー処理を行うにはかなり効率的な方法のように思えるが、私はこれが臭いの場合はそれを正しく行う方法を知りたい:このエラーが処理されますか?

Class Widget 
    ... 
    Public Function IsValid() As Boolean 
     If (some condition isnt met) Then 
      Throw New ApplicationException("Error message") 
     ElseIf (some other condition isnt met) Then 
      Throw New ApplicationException("Another error message") 
     End If 
     Return True 
    End Function 
    ... 
End Class 

... (somewhere else)... 
Public Function DoAwesomeStuff(id As Integer) As String 
    Dim w As Widget() = Widget.GetWidget(id) 
    If w.IsValid Then 
     Do Awesome Things 
    End If 
    Return a string of some sort 
End Sub 

... (somewhere elser)... 
<WebMethod(EnableSession:=True)> 
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> 
Public Function Add(ByVal id As Integer) As String 
    Try 
     //.ToJson is an Extension Method that serializes an obj to JSON 
     Return New With {.Message = DoAwesomeStuff(id)}.ToJson 
    Catch ex As Exception 
     Return New With {.Message = "Error: " & ex.Message, .Error = True}.ToJson 
    End Try 
End Function 

そしてJavaScriptで私が受けてErrorプロパティをチェックしますそれに応じて処理します。それは私のためにうまく動作するようだが、これが臭いかどうかわからない。私はあなたがコントロールフローのためにTry/Catchブロックを使用するはずではないことを知っています、私はこれがコントロールフローとして認めるかどうか分かりません。

+1

私のロジックがあり、私が一緒に渡すことができますエラーメッセージが表示されますが、falseを返すと、検証が失敗した理由がわかりません。私はいくつかのバリデーションルールがあると仮定すると、これは混乱したり、二重検証を引き起こしたりする可能性があります。 – Jason

+2

@StackOverflowException - それ以外の場合は、スタックとWebサービスクライアントの間で意味のあるエラーメッセージを返しますか? – Oded

+0

私の場合、実行できないブランチを作成したという事実はちょっと変わったようです。 IsValidはfalseを返すことはできません。なぜ値を返すのですか? –

答えて

2

はい、それはvexing exceptionにおいがあります。

IsValid関数のユーザーは、TrueまたはFalseを返すと予想します。

たとえば、IsValid関数の有効性を評価するために必要な変数が正しく初期化されていないなど、予期しない場合に例外を使用する必要があります。

あなたが検証ステータスと一緒に検証エラーメッセージを持つようにしたい場合は、例えばByRefパラメータを使用することを検討して、何かのように:私は例外をスローする場合

Public Function IsValid(ByRef invalidReason as String) As Boolean 
    If (some condition isnt met) Then 
     invalidReason = "Error message" 
     return False 
    ElseIf (some other condition isnt met) Then 
     invalidReason = "Another error message" 
     return False 
    End If 
    Return True 
End Function 
+0

ありがとうございました。これはまさに私がやることです。 – Jason

1

私にとって完全に正しいと思われます。

これはシステム境界(Webサービス)上にあるため、例外があった場合はエラーを返すことができます。

ここで唯一の匂いは、IsValidメソッドです。例外を投げるものではありません。呼び出しメソッドは(falseが返された場合)、またはIf句で呼び出す低レベルのメソッドであってもかまいません(独自のメソッドでカプセル化したものと仮定します)。

+0

'IsValid'がブール値を返す場合に、何がうまくいかなかったかを伝える' IsValid'からエラーメッセージを戻すにはどうしたらいいですか? – Jason

+0

@Jason - 例外メッセージが表示されます。呼び出し側が_false_を取得したときにそれがスローされるか、または検証自体によってスローされることを確認してください。 – Oded

関連する問題