这是臭的错误处理吗?

时间:2011-03-06 22:34:24

标签: asp.net error-handling

这似乎是一种非常有效的错误处理方式,但我想知道如果这是臭的正确的方法:

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块来控制流量,我只是不确定它是否符合控制流程的要求。

2 个答案:

答案 0 :(得分:2)

是的,它有 vexing exception 气味。

IsValid函数的用户希望它返回TrueFalse

应在异常情况下使用异常,例如,如果评估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子句中调用的低级方法(假设你已经将它们封装在自己的方法中)。