Pergunta

Eu corri para um dilema interessante hoje. Eu tenho uma função que lida com informações e verifica se há valores duplicados, em seguida, retorna o próximo número que não é uma duplicata. Então, eu tenho algo parecido com isto:

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

Em seguida, na parte inferior da função Eu tenho um bloco catch que manipula o duplicado incrementando até que eu não tenho uma duplicata mais, como este:

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

Como você pode ver, eu quero tratar a exceção especificamente, mas eu também quero jogá-lo quando eu terminar, porque eu quero alertar outro código fora da função.

O problema é que simplesmente jogando ele sai para fora da função com um valor null. Eu estou pensando sobre um try/catch o caminho errado, ou há uma maneira de contornar isso?

Foi útil?

Solução

Se você pegou uma exceção e recuperado a partir dele (com o seu IncrementToNonDuplicate ...), então não há nenhuma razão para lançar mais uma exceção. Código entre captura e tentativa final deve apenas limpar os recursos como fechar um arquivo ou datareader se você vai relançar-lo.

Você poderia, em vez retornar uma estrutura que contém valor NonDuplicate e informações necessárias sobre erros na função. Outra forma seria a de lançar uma exceção personalizada que irá conter informações como "Número inválido: deve ser ...)

Outras dicas

Você pode retornar um booleano que indica se um duplicado for encontrado, e alterar o parâmetro a ser passado no por referência para que você possa atualizar o valor.

Public Function GetNextNonDuplicateNumber(ByRef NonDupeNumber as Long) as Boolean
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top