Estou um pouco em desacordo com um desenvolvedor mais experiente sobre esse assunto e me perguntando o que os outros pensam sobre isso; nosso ambiente é Java, EJB 3, serviços etc.
O código que escrevi chama um serviço para obter e criar coisas. O problema que encontrei foi que recebi exceções de ponteiro nulo que não faziam sentido. Por exemplo, quando solicito ao serviço para criar um objeto, recebo nulo de volta; quando tento procurar um objeto com um ID válido conhecido, recebo nulo de volta. Passei algum tempo tentando descobrir o que havia de errado no meu código; como sou menos experiente, geralmente assumo que fiz algo errado, mas o motivo dos retornos nulos era a segurança. Se o principal de usuário que usa meu serviço não tiver as permissões corretas para o serviço de destino, ele simplesmente retornará nulo. A maioria dos outros serviços aqui também não está muito bem documentada, portanto, aparentemente, isso é apenas algo que você precisa saber.
Isso é um pouco confuso, pois um desenvolvedor escreve um código que interage com o serviço. Faria muito mais sentido para mim se o serviço apresentasse uma exceção que me dissesse que o usuário não tinha as permissões adequadas para carregar ou criar essa coisa; Eu saberia imediatamente por que meu serviço não estava funcionando conforme o esperado.
O desenvolvedor mais experiente que criou o serviço argumentou que solicitar os dados não é uma condição de erro e que exceções devem ser lançadas apenas em uma condição de erro, não quando o usuário não tiver acesso aos dados. Esses dados são frequentemente pesquisados em uma GUI e, para aqueles usuários sem as permissões corretas, essas coisas simplesmente "não existem". Então, resumindo: perguntar não é errado, portanto não há exceção. Os métodos Get retornam nulos porque para esses usuários essas coisas "não existem". Os métodos Create retornam nulo quando o usuário não tem permissão para criar essa coisa.
Isso é normal e / ou boa prática? Eu prefiro usar exceções porque acho muito mais fácil saber o que está acontecendo. Por isso, preferiria, por exemplo, também lançar uma NotFoundException se você solicitasse um objeto com um ID inválido, em vez de retornar nulo.