Pergunta

Estou criando uma biblioteca "comum" para ser usada como referência em vários projetos de solução por outros membros da equipe. Os métodos são normalmente void funções sem dados retornados reais.

Estou procurando um porquê de forçar o uso desses métodos dentro de um Try...Catch bloquear por outros. Preciso garantir que os erros sejam tratados adequadamente. Eu pensei em confiar em um tipo de retorno booleano, mas isso não me permitirá retornar a mensagem de erro também, então minha única opção é jogar um Exception.

Se a forçamento adequado não for possível, como posso fazer um atributo que apareça ao compilar para alertar o desenvolvedor sobre o requisito de tentativa/captura? (tipo de Obsolete atributo).

Alguma outra abordagem melhor?

EDITAR:

Aqui está meu cenário completo:

Eu tenho um método de código chamando um serviço da Web para atualizar um valor remotamente. A atualização é bastante crucial. O método que ele funciona bem, mas e se o serviço da web não for acessível? A chamada não retorna nenhum valor.

Foi útil?

Solução

Colocando algo dentro de um try/catch Block não o torna "tratado adequadamente" - de fato, no grande maioria dos casos, a maneira correta de lidar com uma exceção é deixá -lo borbulhar para o próximo nível. Embargo: try/finally é muito mais comum, para permitir a limpeza de recursos, mas ainda mais comum do que isso using.

Você não pode aplicar "e deve usá -lo corretamente" no código; Isso está implícito em qualquer API, e você estará apenas causando irritação e aborrecimento, e forçando as pessoas a estilos de codificação inadequados e inúteis, ao mesmo tempo completamente artificial e incorreto senso do código estar correto.

Se você deseja ter certeza de que o código funciona corretamente: teste -o.

Não há atributos que você possa usar para esse cenário. Você provavelmente pode criar uma regra do FXCOP ou similar, mas pelas razões acima: eu não a recomendo.

Outras dicas

Na verdade, eu não faria isso, mas como uma solução divertida para o problema declarado, você pode criar seu próprio tipo de exceção: uma sucessão. Em seguida, você joga essa exceção no final do seu método para indicar sucesso. Isso torna o método praticamente inutilizável sem alguma forma de tentativa/captura. Mas novamente: Não faça isso.

Você pode retornar uma classe de resultado personalizada:

public class Result
{
    public bool Okay { get; set; }
    public string Error { get; set; }
}

Então:

var result = AttemptSomething();

if (!result.Okay)
{
    Console.WriteLine(result.Error);
}

Ou talvez volte string:

var error = AttemptSomething();

if (!String.IsNullOrEmpty(error))
{
    Console.WriteLine(error);
}

Ou tenha o erro como um fora:

string error;
if (!AttemptSomething(out error))
{
    Console.WriteLine(error);
}

Ou retornar Exception mas não lançar.

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