Pergunta

Desde que a Microsoft introduziu a aplicação bloqueia, eu estive esbarrar em pessoas que usam o tratamento de exceção Application Block . Eu recentemente tinha me olhar mais de perto e iria resumir a funcionalidade básica como segue (pule o seguinte bloco se você já sabe o que ele faz):

A manipulação de exceção objetivos bloco aplicativo para centralizar e tornar totalmente configurável com arquivos config o seguinte chave manipulação de exceção tarefas :

  • Registrando uma exceção
  • Substituir uma exceção
  • Embalagem uma exceção
  • Propagando uma Exceção
  • etc.

A biblioteca faz isso por ter que modificar seus blocos try catch como segue:

try
{
  // Run code.
}
catch(DataAccessException ex)
{
    bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Policy");
    if (rethrow)
    {
        throw;
    }
}

Com base no que está especificado no app.config para o nome da política ( ver aqui para docs ), HandleException vão quer ...

  • lançar uma nova exceção (substituir a exceção original)
  • enrole a exceção original em uma nova e jogar esse
  • engolir a exceção (ou seja, não fazer nada)
  • você tem relançar a exceção original

Além disso, você também pode configurá-lo para fazer mais coisas com antecedência (por exemplo, log a exceção).

Agora, aqui está o meu problema: Eu completamente não conseguem ver como ela pode ser benéfica para torná-lo configurável se uma exceção é substituído, embrulhado, ingestão ou relançada. Na minha experiência, esta decisão deve ser tomada no momento em que escrever o código, porque você normalmente tem que mudar o código circundante ou chamar quando você altera a exceção comportamento manipulação.

Por exemplo, o código provavelmente vai começar a se comportar incorretamente quando você reconfigurar tal que uma exceção especial jogado em um determinado ponto está agora engoliu em vez de relançada (pode haver código após o bloco catch que não devem ser executados quando a exceção ocorre). O mesmo vale para todas as outras alterações possíveis no tratamento de exceção (por exemplo, substituir -> rethrow, andorinha -> envoltório).

Então, para mim a linha de fundo é que lidar com a exceção problemas Resolve bloco que realmente não existem na prática. O registro de exceção e notificar pouco é bom, mas não é todas as outras coisas apenas um exemplo perfeito para overengineering?

Foi útil?

Solução

Se você usar exceções para controle de fluxo, então você iria querer ficar longe de tratamento de exceção baseada em políticas.

Mas no caso de exceções que você deseja tratar como não recuperável (a tarefa em segundo plano falhou, a tomada foi desconectada, o arquivo foi excluído, etc.), você pode querer ter configurável, tratamento de exceção baseado em políticas .

Por exemplo, se você está desenvolvendo uma API, você pode querer ter cada função em seu lance API apenas as exceções padrão (ArgumentException, etc.), bem como a sua própria exceção específica biblioteca no caso de um interior excepção de não-padrão (por exemplo, um MyLibraryException). Neste tipo de caso, o que importa é que algo não funcionou corretamente. Você não está escolhendo para além da exceção e descobrir o que deu errado. Você está simplesmente reconhecendo o fato de que alguns coisa deu errado, e que você é suposto fazer alguns coisa agora.

Isso alguns coisa deve ser configurável, porque ele realmente não importa o que você faz. Exibir uma caixa de mensagem para o usuário? Modal ou não modal? Log a exceção? Como você quer registrar a exceção? Chamar um serviço web logging? Anexar um arquivo de log? Escrever para o log de eventos do Windows? Inserir uma entrada no banco de dados? Inserir uma entrada em duas bases de dados? Realmente não importa para o resto da sua aplicação. A escolha de como lidar com uma exceção é completamente ortogonal ao resto da aplicação.

(Como um aparte, isso não é como eu iria abordar baseado em políticas exceção de manipulação configurável. Eu faria tende mais para um estilo AOP, como registrar um interceptor exceção-logger no recipiente.)

Outras dicas

Eu executar para esse problema quando eu estou desenvolvendo funções que não têm estado recuperável. Eu acredito que este impulsionado política de tratamento de exceção é realmente útil e garante que todos os outros desenvolvedores que fazem parte deste projeto realmente aderir a um padrão para exceções não recuperáveis.

Eu concordo com os cartazes acima, você pode querer ficar longe de exceções com base política se você estiver usando-os para o fluxo de controle.

Eu tenho que concordar com a afirmação de que "a manipulação de exceção problemas Resolve bloco que realmente não existe na prática." Eu usei o bloco desde o seu lançamento e eu raramente sinto que estou realmente ganhando muita usando-o. Bem, talvez um pouco de dor de cabeça. :)

Antes de começar, eu vou admitir que eu gosto do Exceção Blindagem no WCF limites de serviços funcionalidade. No entanto, que foi adicionado recentemente, não envolve nenhuma codificação - somente atributos e configuração, e não é como o bloco é normalmente vendido. Isto é como Microsoft mostra que em http://msdn.microsoft.com/en -us / library / cc309250.aspx

text alt

Para os meus olhos o acima é controle de fluxo.

try
{
  // Run code.
}
catch(DataAccessException ex)
{
    bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Policy");
    if (rethrow)
    {
        throw;
    }
}

Quando você combina o aspecto de controle de fluxo com o código acima você definitivamente não estão fazendo olhar código errado errado. (Não importa que o if (rethrow) construção não oferece muito abstração.) Isso pode tornar a manutenção mais difícil para os desenvolvedores não estão familiarizados com as definições de política. Se o postHandlingAction no arquivo de configuração é alterado (que provavelmente vai acontecer em algum momento), você provavelmente vai encontrar o aplicativo se comportar de maneiras inesperadas que nunca foram testadas.

Talvez eu não iria encontrá-lo tão censurável se o bloco não lidar com controle de fluxo, mas simplesmente lhe permitiu manipuladores de cadeia juntos.

Mas talvez não. Eu realmente não lembro ter sido convidado a:

  • adicionar uma nova peça de funcionalidade ao manusear uma exceção (por exemplo, além de registro para o log de eventos também enviar um e-mail. Na verdade, o bloco de registro pode fazer isso por conta própria se você já está registrando a exceção si mesmo. :) )
  • alterar o comportamento manipulação de exceção (andorinha, relançar, ou lançar novo) através de um todo "política".

Eu não estou dizendo que isso não acontece (eu tenho certeza que alguém tem uma história!); Eu apenas sinto que o Exception Handling Application Block faz programas mais difícil de entender e manter e isso geralmente supera a funcionalidade fornecida pelo bloco.

Eu não acho que isso é mais de engenharia de todo. de fato. o fato de que exceções podem passar através de um manipulador central tem sido uma coisa boa na minha linha de trabalho. i tiveram desenvolvedores que comemos todos os exceção - tratada ou não para que ele não iria bolha para o topo e colocar algo alarmante em frente ao usuário final ou seriamente bagunçar um serviço / daemon quando não capturada.

Agora, com a política, podemos iniciar o registro a qualquer momento sem ter que reiniciar ou desnecessariamente lógica logging polvilhar em todo o aplicativo. agora podemos assistir exceções e similares tudo sem tomar o aplicativo offline.

programação inteligente se você me perguntar ...

Muito simplesmente:. Se você quer tratamento de exceção diferente no seu código de liberação que em seu código de depuração, em seguida, seria útil

Na minha opinião, um valor real de usar o Exception Handling bloco começa com a uma linha de código em seu bloco de captura:

bool rethrow = ExceptionPolicy.HandleException (ex, "Data Access Policy");

Uma linha de código - como simples você pode obter? Atrás da uma linha de código, a política, como ele está configurado, faz atribuição / atualidades uma política são facilmente realizadas, tudo sem ter que recompilar o código-fonte.

Como foi mencionado, a política de exceção pode realmente executar várias ações - o que é definido em sua política. Escondendo a complexidade por trás da uma linha de código, como mostrado dentro do bloco catch, é onde eu ver o valor real.

Eu diria complexa, mas não overengineered. Então, meus pensamentos são de que grandes dividendos será visto durante a manutenção quando você está precisando de mudar a maneira que você está segurando / registrando exceções por ter a flexibilidade de configuração mudança facilmente, e ainda tem a mesma linha de um de código-fonte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top