Это вонючая обработка ошибок?
Это кажется довольно эффективным способом обработки ошибок, но я хочу знать, как сделать это правильно, если это вонючий:
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
предложения (при условии, что вы инкапсулировали их в свои собственные методы).