Pergunta

Em VB.NET Costumo Catch…When:

Try
    …
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES"
    …
End Try

Existe um C # equivalente a Catch…When?

Eu não quero recorrer ao uso de uma declaração if dentro de um catch se possível.

Foi útil?

Solução

Esta funcionalidade foi anunciado para C # 6. Agora é possível escrever

try { … }
catch (MyException e) when (myfilter(e))
{
    …
}

Você pode baixar o preview do Visual Studio 2015 agora de verificar isso, ou aguardar o lançamento oficial.

Outras dicas

Não há equivalente a Catch…When em C #. Você realmente vai ter que recorrer a uma declaração if dentro de sua catch, então relançar se sua condição não for cumprida:

try
{
    …
}
catch (ArgumentNullException e)
{
    if ("SAMPLES" == e.ParamName.ToUpper())
    {
        … // handle exception
    }
    else
    {
        throw;  // condition not fulfilled, let someone else handle the exception
    } 
}

Isso não vai recriar a mesma semântica do VB pegar quando expressão. Há uma diferença fundamental. A VB Quando a expressão é executada antes de ocorrer o desenrolar pilha. Se você fosse para examinar a pilha no ponto de quando o filtro, você realmente ver o quadro onde a exceção foi lançada.

Ter um caso no bloco catch é diferente porque as executa o bloco capturas após a pilha é desenrolado. Isto é especialmente importante quando se trata de Relatório de Erros. No cenário VB você tem a capacidade de deixar de funcionar com um rastreamento de pilha, incluindo o fracasso. Não é possível obter esse comportamento em C #.

EDIT:

detalhado post sobre o assunto.

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