Это вонючая обработка ошибок?

Это кажется довольно эффективным способом обработки ошибок, но я хочу знать, как сделать это правильно, если это вонючий:

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 ответа

Решение

Да, у него неприятный запах исключения.

Пользователи 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

Выглядит совершенно справедливо для меня.

Поскольку это находится на границе системы (веб-служба), вполне нормально попытаться вернуть ошибку, если возникла исключительная ситуация.

Единственный запах здесь в IsValid метод - это действительно не должно быть одно исключение. Вызывающий метод должен (когда возвращается false) или даже методы более низкого уровня, которые вы вызываете в If предложения (при условии, что вы инкапсулировали их в свои собственные методы).

Другие вопросы по тегам