Eu também. 
Creio que este seja seu principal objetivo, pois promove economia de codificação e reduz a complexidade ciclomática/condicional (utilização de if), podendo fornecer informações personalizadas sobre um evento, com o intuito de facilitar o debug.
Neste ponto, eu, em particular, não consigo ajudar, mas sim, é possível.
O que eu recomendaria na verdade, é tentar aproveitar as exceções existentes no Java.
Por exemplo, esta exceção que você “quer” criar pode ser capturada pelo IllegalArgumentException, mais ai é questão de finalidade e até mesmo gosto a depender da situação.
Para ter uma noção eu preferiria implementar uma classe abstrata que tivesse a responsabilidade de organizar estas exceções:
Veja este exemplo:
Classe de teste:
public class Teste{
@SuppressWarnings("CallToPrintStackTrace")
public static void main(String[] args) {
try {
ExcecaoPersonalizada.IntervaloIlegal(1, 3, 6);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
try {
ExcecaoPersonalizada.IntervaloIlegal("Com mensagem auxiliar", 8, 2, 7);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
String emTeste = "Media de acerto";
try {
ExcecaoPersonalizada.IntervaloIlegal("O tamanho da String -> "+emTeste.length()+" é maior que o permitido: 5 ", emTeste.length() > 5);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
}
Classe para gerenciamento de exceções
public abstract class ExcecaoPersonalizada {
/**
* Utiliza um intervalo numérico para validar um argumento numérico
* @param mensagem visa esclarecer possíveis motivos do erro
* @param excecaoPrevista se um teste for verdadeiro lança uma exceção
* @throws IllegalArgumentException quando a variável em análise estiver
* fora do intervalo de análise aceitável
*/
public static final void IntervaloIlegal(String mensagem, boolean excecaoPrevista) throws IllegalArgumentException{
if (excecaoPrevista) {
throw new IllegalArgumentException(mensagem);
}
}
/**
* Utiliza um intervalo numérico para validar um argumento numérico
* @param variavel a ser validada dentro de um intervalo
* @param inicio do intervalo
* @param fim do intervalo
* @throws IllegalArgumentException quando a variável em análise estiver
* fora do intervalo
*/
public static final void IntervaloIlegal(double variavel, double inicio, double fim) throws IllegalArgumentException{
IntervaloIlegal("", variavel, inicio, fim);
}
/**
* Utiliza intervalos numérico para validar um argumento numérico
* @param mensagem informação utilizada para ajudar a resolver um problema
* @param variavel a ser validada dentro de um intervalo
* @param inicio do intervalo
* @param fim do intervalo
* @throws IllegalArgumentException quando a variável em análise estiver
* fora do intervalo
*/
public static final void IntervaloIlegal(String mensagem, double variavel, double inicio, double fim) throws IllegalArgumentException{
IntervaloIlegal(mensagem + "\nO valor da variável -> [" + variavel + "] esta fora do intervalo disponibilizado [" + inicio + " , " + fim + "]", variavel < inicio || variavel > fim);
}
}
Ao meu ver, a documentação deve ser um dos fatores de esclarecimento sobre a utilização desta técnica, não convencional.
No momento é a melhor contribuição que posso ofertar.
Té+