Essa é bem simples, porém, exige uma certa experiência para começar a utilizá-la. É mais fácil entender com um exemplo. Vejamos:
Num dado aplicativo, quando o usuário precisa executar uma ação administrativa, o aplicativo faz uma consulta a um método para verificar se o usuário possui o perfil administrativo. Se possuir, o aplicativo permite ao usuário executá-la, caso contrário, é óbvio, não permite. Entenda um método como o abaixo:
private bool IsAdministrator(string userName) {
bool isAdministrator = true;
try {
// Consulta ao banco, checagem do perfil, etc
}catch{
}
return(isAdministrator);
}
Qual é o problema com este método? A princípio, nada. Se tudo ocorrer bem na consulta ao banco, em seguida à validação do perfil, o método é capaz de avaliar se o usuário possui ou não o perfil administrativo. Mas... e se ocorrer um exceção? Se a consulta ao banco falhar ou se a checagem não puder ser feita? Aí o método retorna "Sim, este usuário é administrador.".
Isto acontece porque a variável isAdministrator é setada (isso existe?) de maneira positiva. O método assume que o usuário possui o perfil administrativo e aí consulta o banco para provar o contrário. Ocorrendo alguma exceção, como o bloco catch esconde qualquer problema, o método retorna um resultado positivo. E coisas ruins acontecerão ao aplicativo...
Existe pelo menos duas maneiras rápidas de trabalhar com este tipo de situação, contudo, tudo depende muito mais de se fazer um esforço consciente para evitar este tipo de coisa. Shit happens (c) Forrest Gump. :) Mas você tem que estar preparado para antecipá-la. Como?
Para todos as classes e métodos que você escrever, pense que coisas ruins vão acontecer a ele. O banco de dados vai ficar fora do ar por alguns segundos, o input do usuário vai ser viciado, alguém vai (não você, claro) esquecer de informar aquele parâmetro importantíssimo no arquivo de configuração ou sua classe/método vai ser burlada de alguma forma. Eu sei, não é um jeito Pollyanna de viver, mas vai salvar sua pele várias vezes. Assuma o resultado negativo primeiro, que causa menor impacto, e aí tente prová-lo contrário.
Voltando ao método acima, só pra fechar o exemplo, seria razoável:
-
Assumir um valor negativo para a variável isAdministrator de saída e daí fazer as checagens no banco.
-
Ocorrendo uma exceção, forçar o valor da variável isAdministrator para falso. Ora, se ocorreu uma exceção, melhor remediar, certo?
Utilizando ambos os expedientes o método ficaria assim:
private bool IsAdministrator(string userName) {
bool isAdministrator = false;
try {
// Consulta ao banco, checagem do perfil, etc
}catch{
isAdministrator = false;
}
return(isAdministrator);
}
E é isso. Código mais robusto no capricho.