A resposta é obviamente "depende", mas, considerando o seu caso de uso, eu diria que não. Aqui está o porquê:
O C # é uma linguagem orientada a objetos maravilhosa. É tão bom, de fato, que às vezes me pego tentando implementar uma visão fanaticamente purista do que começou como um projeto simples. Isso não me acontece muito quando se escreve JavaScript ou Objective-C ou PHP.
Quando entro nesse "modo", esse tipo de paralisia, um dos sintomas pode ser uma obsessão pelo tratamento de exceções, pelos genéricos e pela metaprogramação. Às vezes, os três juntos. É muito mais provável que seja um problema quando estou trabalhando em algo novo, relativamente desconhecido ou com especificações e objetivos de má qualidade. Em vez de me atrapalhar nos detalhes da implementação , acho, por que tentar criar algo que possa acomodar a maioria dos cenários que eu razoavelmente antecipo? Então, quando eu contornar os detalhes, os alicerces serão estabelecidos e eu escreverei vários métodos pequenos e atarracados, e assim por diante. Talvez alguém trabalhe no código da interface do usuário, eu apenas prestarei esses bons serviços e esses contratos ...
Infelizmente, isso ainda não aconteceu comigo. O que tende a acontecer é que eu começo por esse caminho trabalhando em "infraestrutura" - coisas como:
- Escrevendo minhas próprias interfaces de contêiner IoC ou mexendo com
Castle.Windsor
- Determinando como lidarei com o mapeamento de tipos no aplicativo
- Gravando a lógica do fluxo de controle para classes base abstratas que se assemelham
Interceptors
e agrupam chamadas para membros abstratos com manipulação de exceção
- Criação de classes base abstratas para
IRepository
, IUnitOfWork
, IDomainService
, ICrossCuttingValidation
, etc.
- Tentando descrever um modelo de objeto hierárquico para algo cuja própria natureza nega tal meta-abordagem ( como
IFrameworkException
)
Quando você se pergunta se a descrição de uma exceção é precisa o suficiente para o seu gosto, você está realmente negando que algum outro recurso crítico seja implementado. A natureza da exceção também é reveladora - não é uma exceção orientada a eventos , ocorre evidentemente longe de qualquer metodologia de entrada (como uma interface do usuário ou um pipe ou algo assim) e é provavelmente determinística por natureza - como em, você não pode prever o que um usuário digitará, mas você pode prever qual montagem você escolherá carregar ou outros enfeites.
A propósito, se a descrição o incomoda tanto, você não pode escrever um método de extensão para substituí-lo no escopo apropriado?
Então, isso é realmente apenas eu projetando minha própria paralisia de abstração e análise em você, mas acho que pode ser apropriado. Eu diria que, para permanecer no lado seguro, apenas subclasse an Exception
quando:
- Na verdade, você experimentou uma exceção de tempo de execução que deseja tratar em geral
- A exceção de tempo de execução não é algo que você possa descartar razoavelmente em tempo de design
- A exceção ainda não está bem coberta pelo grande número existente de
Exception
subclasses
- Você realmente tem uma ideia de como deseja lidar com a exceção OU, se não, apenas porque é tão complicado que você precisa pensar nela e voltar a ela.
- Sua ideia vai além de alterar seus metadados, seu escopo, sua exceção interna etc., e lida mais com o objeto ou evento subjacente que produz a exceção e / ou os meios de realmente lidar com ele
- Você já escreveu ou não é responsável pela maior parte do lado voltado para entrada de coisas como a interface do usuário