Catch, Handle, então relançar exceção?
-
20-08-2019 - |
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?
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