这似乎是一种非常有效的错误处理方式,但我想知道如果这是臭的正确的方法:
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
块来控制流量,我只是不确定它是否符合控制流程的要求。
答案 0 :(得分: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
答案 1 :(得分:1)
看起来对我来说完全有效。
由于这是在系统边界(Web服务)上,如果有异常,尝试返回错误是完全可以的。
这里唯一的气味是IsValid
方法 - 它实际上不应该是抛出异常的那个。调用方法应该(当返回false时),或者甚至是你在If
子句中调用的低级方法(假设你已经将它们封装在自己的方法中)。