Exceptions poderia/deveria ser usada para tratar fluxo do modelo

Pessoal,
Gostaria de saber se eu poderia/deveria utilizar exceptions para tratar fluxo da camada de modelo, isto é lançar um ModelException.
O questionamento é porque na verdade não ocorreu verdadeiramente uma exceção e sim uma ação previsível.

Ex: Um usuário não possui determinada “função na empresa” ele não poderia executar determinado método. Então se ele tentar executar aquele método, eu deveria lançar (throws) uma exceção ou deveria tratar com ifs?

Muito interessante sua pergunta. Vou pesquisar sobre isso. Mas no caso, não seria possivel deixar o metodo private?

Pense na seguinte situação:

Um método que faz uma validação de dados qualquer de uma pessoa através do CPF. O método recebe o CPF da tal pessoa. Nesse caso, será necessário fazer uma verificação para garantir que o CPF foi informado antes de executar a validação, ou seja, para evitar uma exceção, o parâmetro deverá ser verificado, caso não tenha sido informado, a exceção será lançada e deverá ser devidamente tratada para informar ao usuário do erro ocorrido e o que deve ser feito.

Conclusão:
Se um método é feito para fazer tal coisa, porém, há riscos de não ser executado corretamente, deve-se procurar os possíveis motivos que podem causar erro na execução, e fazer as devidas tratativas para que não ocorram exceções, ou seja, tratar o código usando try ... catch / throws.

Espero ter sido claro.

O seu método de negócio deve estar protegido. Imagine o seguinte método:

faturarNota(Usuario usuario, Nota nota)

perceba que fluxo correto do método é que, ao final, a nota esteja faturada. O nome é “faturarNota” e não “tenteFaturarNota”. Assim, se alguma pré-condição não é atendida o fluxo deve ser interrompido, método não pode prosseguir, e nesse caso, uma exceção deve ser lançada. Quem deve cuidar para que as pré-condições do método faturaNota seja atendida e que o método execute sem problemas é quem chama o método faturarNota.

Aproveitando essa pergunta eu sempre tive uma dúvida de como usar o try catch. Eu devo usar sempre ele como uma forma de apenas transmitir informacoes ex:

try{ faz algo... }catch(){ " Você fez algo errado" }

Ou…
Mas ,eu sei que funciona , mas seria uma boa pratica de programacao usar um assim:
`
boolean x = false;

try{
faz algo…
}catch(){
x = true;
}