Does it matter which type of exception to throw as long as the error message is useful?
Em casos como este, muitas vezes adiro para os documentos oficiais para definições e exemplos de uso.
Os documentos para RangeError
são um pouco concisos:
RangeError
Raised when a given numerical value is out of range.
[1, 2, 3].drop(1 << 100)
raises the exception:RangeError: bignum too big to convert into long
E, embora os documentos para ArgumentError
impliquem o incentivo para um Exception
mais específico, um dos exemplos (em negrito abaixo) certamente parece ser uma correspondência em potencial para seu caso de uso:
ArgumentError
Raised when the arguments are wrong and there isn't a more specific Exception class.Ex: passing the wrong number of arguments
[1, 2, 3].first(4, 5)
raises the exception:ArgumentError: wrong number of arguments (2 for 1)
Ex: passing an argument that is not acceptable:
[1, 2, 3].first(-4)
raises the exception:ArgumentError: negative array size
Em geral, as exceções Argument
-type são uma forma clara e esperada de transmitir ao chamador que eles forneceram alguns parâmetros inválidos.
Quanto à sua menção a " ... contanto que a mensagem seja útil ... ", digo sim, absolutamente. Sempre tente incluir uma mensagem significativa quando você gerar um erro.
Com relação à alternativa de objeto nulo: Pessoalmente, sugiro que você aumente explicitamente o erro em vez de retornar um objeto nulo (ou algum outro indicador fora dos limites). Código construído com este padrão é atormentado por verificações de nulos constantes e, inevitavelmente, um objeto nulo vai escapar de suas redes de segurança e causar estragos inesperados em seu programa.
Quando estou trabalhando com um software que rotineiramente retorna valores nulos ou valores especiais como um indicador de "algo deu errado", preciso gastar mais ciclos mentais para ter certeza de que estou verificando todas as respostas e que estou procurando os sinalizadores de erro certos. (Mas a convenção é certamente um fator, portanto, se você estiver trabalhando com uma base de código existente que usa o padrão de objeto nulo, talvez seja melhor continuar.)
Veja algumas boas leituras adicionais sobre exceções versus variáveis de erro: As variáveis de erro são um padrão ou um bom design?