2009-06-26 5 views
1

오늘 나는 흥미로운 딜레마에 부딪쳤다. 나는 정보를 처리하고 중복 된 값을 검사하는 함수를 가지고 있으며, 중복되지 않은 다음 숫자를 리턴한다.잡기, 처리, 예외 재발생?

을 :이처럼, 더 이상 중복이없는 때까지

Public Function GetNextNonDuplicateNumber(NumberToCheck as Long) as Long 

     //the non-duplicate the function will return 
     Dim NonDuplicate as Long 

     If CheckForDuplicate(NumberToCheck) = True Then 
      Throw New DuplicateException() 
     Else 
      NonDuplicate = NumberToCheck 
     End If 

End Function 

그럼이 증가하여 중복을 처리하는 catch 블록이 함수의 맨 아래에 : 그래서,이 같은 뭔가를

Catch ex as DuplicateException 
    NonDuplicate = IncrementToNonDuplicateValue(NumberToCheck) 
    Throw ex 
    Return NonDuplicate 
End Function 

자세히 알 수 있듯이 특별히 예외를 처리하고 싶습니다.하지만이 기능을 벗어난 다른 코드에 경고를하기 때문에 작업을 마친 후에 던지고 싶습니다.

문제는 단지 null 값을 가진 함수 밖으로 빠져 나가는 것이 문제입니다. try/catch을 잘못 생각하거나이 문제를 해결할 방법이 있습니까?

답변

3

예외가 발생하여이를 (IncrementToNonDuplicate ...로) 복구 한 경우 더 이상 예외를 throw 할 이유가 없습니다. catch와 end try 사이의 코드는 파일이나 datareader를 닫을 때처럼 파일을 닫는 것처럼 리소스를 정리해야합니다.

오히려 NonDuplicate 값과 함수의 오류에 대한 필수 정보가 포함 된 구조를 반환 할 수 있습니다. 다른 방법은 "유효하지 않은 숫자입니다 : ...이어야합니다"와 같은 정보를 포함하는 사용자 정의 예외를 throw하는 것입니다.

1

중복이 발견되면이를 나타내는 부울을 반환하고 전달할 매개 변수를 변경할 수 있습니다 참고로이 값을 업데이트 할 수 있습니다.

Public Function GetNextNonDuplicateNumber(ByRef NonDupeNumber as Long) as Boolean 
+0

을이 Int32.TryParse' 등 실제로 훨씬 건전한 방식이며, 모방'. (7 년 후, 나는 알고있다, 그러나 아직도이 영업 이익의 일한다고 선택의 경로). – Abel