Não pare o depurador NAQUELA exceção quando ele é lançado e capturado

91

Em ferramentas / exceções, defini a opção de que o depurador pare quando uma exceção é lançada. Quer seja pego ou não.

Como posso excluir uma exceção a essa regra? Em algum lugar do meu código, há uma exceção detectada que faz parte da lógica do programa. Obviamente, não quero que essa exceção pare o depurador sempre que for atingida.

Exemplo: desejo ignorar a exceção de referência nula (que foi detectada) na linha 344. Eu quero parar em todas as outras exceções

MichaelD
fonte
6
Quando essa exceção faz parte da sua lógica de programação (pense nisso, se você realmente precisa implementá-la dessa maneira) - então ela deve ser pelo menos uma exceção derivada criada por nós mesmos. Desta forma, você pode aplicar a solução de Brian.
tanascius,
Aqui está o problema: stackoverflow.com/questions/1957907/…
MichaelD
2
@tanascius - +1 Concordo na maioria dos casos As exceções não são a melhor maneira de tomar uma decisão lógica; no entanto, em alguns casos, como quando desserializar o tratamento de exceções, às vezes é inevitável, portanto, throw> catch> handle é a única opção razoável.
jpierson
2
@Ando desculpe minha má. Moderar várias guias de uma vez é eficiente, mas nem sempre preciso.
2
@tanascius: talvez você ainda precise capturar uma exceção de estrutura conhecida antes de lançar a sua própria em resposta. Sua sugestão nem sempre é possível.
Dan Puzey de

Respostas:

40

Se bem me lembro, você pode usar um DebuggerStepThroughatributo no método que contém o código que você não deseja que a exceção dispare. Suponho que você possa isolar o código que dispara a exceção irritante em um método e decorá-lo com o atributo.

Chris Chou
fonte
31
Pela resposta do malinger e pela minha experiência, essa resposta parece estar incorreta. O DebuggerStepThroughatributo não afeta o comportamento do depurador com exceções de primeira chance.
Michael Petrotta
5
@Tim, testei e NÃO para. confira minha resposta: stackoverflow.com/questions/1420390/3455100#3455100
Shimmy Weitzhandler
1
+1 funciona no VS2010 para código .NET 4.0 puro e Silverlight 4 para exceções não tratadas.
Mike Post,
6
Observação importante: Isso não funciona para métodos do tipo espera assíncrono. Mais aqui
i3arnon
8
Por MSDN, o DebuggerStepThroughatributo não tem significado para o CLR. Ele é interpretado por depuradores. Parece que não funciona de maneira confiável em uma variedade de circunstâncias e DebuggerHiddenfuncionará de forma confiável stackoverflow.com/a/3455100/141172
Eric J.
64

DebuggerHidden é seu amigo!

O common language runtime não atribui semântica a este atributo. Ele é fornecido para uso por depuradores de código-fonte. Por exemplo, o depurador do Visual Studio 2005 não para em um método marcado com este atributo e não permite que um ponto de interrupção seja definido no método. Outros atributos do depurador reconhecidos pelo depurador do Visual Studio 2005 são DebuggerNonUserCodeAttribute e DebuggerStepThroughAttribute.

Testado em VS2010 e funciona muito bem.

Embora DebuggerStepThroughpareça funcionar também para algumas versões específicas do depurador, DebuggerHiddenparece funcionar para uma gama mais ampla de situações com base nos comentários de ambas as respostas.

Observe que ambas as opções não funcionam atualmente com métodos de bloco iterador ou para métodos assíncronos / aguardar . Isso pode ser corrigido em uma atualização posterior do Visual Studio.

Shimmy Weitzhandler
fonte
trabalhando no VS2008. Você tem que aplicá-lo a todo o método, incluindo o bloco catch, ou você apenas quebrará em outro lugar
Mark Heath,
1
Eu adicionei esse atributo a um método e o depurador apenas parou no método de chamada dele. Estou esquecendo de algo?
Doogal
1
É assim que deve ser. para evitar isso, você terá que lidar com a exceção ... Ou, alternativamente, marcar o método do chamador DebuggerHiddentambém ...
Shimmy Weitzhandler
1
Observe que o atributo DebuggerStepThrough deve ser suficiente para evitar a quebra de exceções. DebuggerHidden atua como uma combinação de DebuggerNonUserCode e do Atributo DebuggerStepThrough.
jpierson
14

DebuggerStepThrough é aquele a ser usado para evitar que o depurador interrompa um método em que haja um try / catch.

Mas isso só funciona se você não desmarcar a opção "Ativar apenas meu código (somente gerenciado)" nas configurações gerais das Opções de depuração do Visual Studio (menu Ferramentas / Opções, nó Depuração / Geral) ...

Mais informações sobre esse atributo em http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/

DebuggerHidden simplesmente impedirá que o Debugger exiba o método onde a exceção é lançada. Em vez disso, ele mostrará o primeiro método na pilha que não está marcado com aquele atributo ...

Valery Letroye
fonte
1
Observe que isso não funciona mais por padrão no VS 2015, consulte o blog do VS para saber como habilitá-lo
bhh
Infelizmente, a solução alternativa para o VS 2015 não funciona para o VS 2019.
Jonathan Allen
13

Os atributos especificados nas outras respostas (e outros como DebuggerNonUserCodeatributo) não funcionam mais da mesma maneira por padrão no Visual Studio 2015. O depurador interromperá as exceções no mercado de métodos com esses atributos, ao contrário das versões anteriores do VS. Para desativar o aprimoramento de desempenho que alterou seu comportamento, você precisa alterar uma configuração de registro:

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1

Mais informações podem ser encontradas no blog do Visual Studio .

(Isso provavelmente deve ser um comentário sobre a resposta principal, mas não tenho representantes suficientes)

bhh
fonte
3

Você não é capaz de destacar uma exceção lançada em um local específico em seu código. No entanto, você pode desativar exceções de um tipo específico.

Se seu próprio código gerar a exceção em questão, eu faria uma exceção personalizada, derivada de tudo o que se encaixar, e, em seguida, desabilitaria a quebra de depuração neste tipo derivado.

Desativar exceções do sistema como NullReferenceException afetará todo o sistema, o que obviamente não é desejável durante o desenvolvimento.

Observe que há dois tipos de comportamento de quebra para exceções:

  • Lançado: Se selecionado, quebra assim que uma exceção deste tipo é lançada
  • Não tratado pelo usuário: Se selecionado, interrompe somente se a exceção, desse tipo, não for tratada por um try / catch.

Você pode remover a verificação em 'Thrown' para o NullReferenceException, que lhe dará o benefício de não quebrar cada vez que o sistema passar a linha em questão em seu código, mas ainda quebrar se você tiver alguma expecção NullReference não tratada ocorrendo em outras partes do sistema.

Lars Udengaard
fonte
3
Adicionar o atributo DebuggerStepThrough a um método no Visual Studio 2010 impedirá o depurador de interromper uma exceção não tratada lançada pelo método.
Tim Murphy
Testei e não impede; ainda para
Shimmy Weitzhandler
1
@Shimmy - Funciona para mim! Certifique-se de aplicar DebuggerStepThrough a cada método do ponto em que ele é lançado até o ponto em que deseja que a exceção se torne visível na pilha de chamadas. Se você capturar a exceção e tratá-la dentro da hierarquia de chamada onde todos os métodos são decorados com DebuggerStepThrough, você nunca deverá ver o VS quebrar nessa exceção.
jpierson