2011-03-06 2 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 

그리고 나서 응답에 Error 속성에 대한 확인 자바 스크립트에서 그에 따라 처리하십시오. 그것은 나를 위해 잘 작동하는 것처럼 보이지만, 이것이 냄새 나는지 확실하지 않습니다. 나는 당신이 제어 흐름을 위해 Try/Catch 블럭을 사용하도록되어 있지 않다는 것을 안다. 나는 이것이 제어 흐름으로 자격이되는지 아닌지 잘 모르겠다.

+1

내 논리는 내가 함께 전달할 수 있다는 오류 메시지가 사용자에게 표시되는 반면 false를 반환하면 유효성 검사가 실패한 이유를 알지 못합니다. 몇 가지 유효성 검사 규칙이 있다고 가정하면 혼란 스러울 수 있으며 이중 유효성 검사가 발생할 수 있습니다. – Jason

+2

@StackOverflowException - 어떻게 스택과 웹 서비스 클라이언트의 의미있는 오류 메시지를 반환 할 예정입니까? – 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

저에게 완벽하게 보입니다.

시스템 경계 (웹 서비스)에 있기 때문에 예외가 발생하면 오류를 반환하는 것이 좋습니다.

유일한 냄새는 IsValid 방법에 있습니다. 실제로 예외를 던지면 안됩니다. 호출 메서드는 (false가 반환 된 경우) 또는 If 절 (호출자가 자신의 메서드에 캡슐화했다고 가정)에서 호출하는 하위 수준 메서드 여야합니다.

+0

'IsValid'가 부울 값을 반환하면 무엇이 잘못되었는지 알려주는'IsValid'에서 오류 메시지를 다시 얻으려면 어떻게해야합니까? – Jason

+0

@ Jason - 예외 메시지가 표시됩니다. 호출자가 _false_를 얻었을 때 호출자에 의해 던져 지거나 검증 자체가 던져 지는지 확인하십시오. – Oded

관련 문제