Visual Studio: Como interromper as exceções manipuladas?

165

Gostaria que o Visual Studio fosse interrompido quando ocorrer uma exceção manipulada (ou seja, não quero apenas ver uma mensagem "Primeira chance", quero depurar a exceção real).

por exemplo, eu quero que o depurador quebre na exceção:

try
{
   System.IO.File.Delete(someFilename);
}
catch (Exception)
{
   //we really don't care at runtime if the file couldn't be deleted
}

Me deparei com essas notas para o Visual Studio.NET:

1) No VS.NET, vá para o menu Debug >> "Exceptions ..." >> "Common Language Runtime Exceptions" >> "System" e selecione "System.NullReferenceException"

2) Na parte inferior da caixa de diálogo, há uma caixa de grupo "Quando a exceção é lançada:", selecione "Invadir o depurador"

3) Execute seu cenário. Quando a exceção é lançada, o depurador irá parar e notificá-lo com uma caixa de diálogo que diz algo como: "Uma exceção do tipo" System.NullReferenceException "foi lançada. [Break] [Continue]"

Pressione [Quebrar]. Isso colocará você na linha de código que está causando o problema.

Mas eles não se aplicam ao Visual Studio 2005 (não há opção de exceções no menu Debug ).

Alguém sabe onde a caixa de diálogo encontrar essas opções no Visual Studio encontra a caixa de grupo " Quando a exceção é lançada ", com a opção " Invadir o depurador "?

Atualização: O problema era que meu menu Debug não tinha um item de Exceções . Eu personalizei o menu para adicioná-lo manualmente.

Ian Boyd
fonte
9
No VS2015, estava em Debug-> Windows-> Exception Settings
PeterVermont 11/11
Levei um tempo para descobrir como restaurar as configurações de exceção padrão depois de alterar algumas configurações de exceção, portanto, uma nova resposta. restaurar configurações de exceção para o padrão
Mabito

Respostas:

170

Com uma solução aberta, vá para a opção de menu Debug - Exceptions ( Ctrl+ D, E). A partir daí, você pode optar por quebrar as exceções lançadas ou não tratadas pelo usuário .

Edição: Minha instância é configurada com o "perfil" C # talvez não esteja lá para outros perfis?

Austin Salonen
fonte
10
eu simplesmente não tenho essa opção. Isso explicaria minha confusão.
Ian Boyd
58
Eu tinha o menu de depuração, mas não há opções de exceções. eu personalizei o menu para adicioná-lo manualmente; a tecla de atalho trabalhou de qualquer forma (Ctrl + Alt + E)
Ian Boyd
3
Além disso, você pode redefinir o environement VS2010, indo até "Ferramentas", "Configurações de Importação de Exportação" e selecione um reset para o ambiente C # ... ele contém as exceções do item de submenu
BeardinaSuit
14
Eu selecionei Common Language Runtime Exceptions> <All Common Language Runtime Exceptions not in this list>no Visual Studio 2017 e todos os meus sonhos mais loucos se tornaram realidade.
Aaron Newton
9
Visual Studio 2015: Debug -> Windows -> Configurações de exceção
achecopar
47

Há uma janela 'exceções' no VS2005 ... tente Ctrl+ Alt+ Eao depurar e clique na caixa de seleção 'Lançada' da exceção em que você deseja interromper.

Rob Walker
fonte
É exatamente o que eu quero. Onde está isso no menu? Pela minha vida eu não consigo encontrá-la.
Ian Boyd
O atalho de teclado podem mudar de acordo com o perfil (C # desenvolvedor, desenvolvedor C ++, etc.)
Asaf R
1
Eu tenho um item de menu: Depurar -> Exceções. Isso é com o VS2005 Professional. Você está executando uma edição Express?
Rob Walker
5
se você deseja o item de menu Exceções: Selecione Ferramentas | Personalizar .... Clique na guia Comandos. Selecione a categoria Debug na caixa Categorias. Encontre o item de comando Exceções ... e arraste-o para o menu Debug na parte superior do aplicativo, soltando-o no local apropriado no menu. (encontrado nos comentários em: blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/… )
sotto
33

Demorei um pouco para encontrar o novo local para as configurações de expecção, portanto, uma nova resposta.

Desde o Visual Studio 2015, você controla quais exceções devem ser interrompidas na janela Configurações de exceção (Depurar-> Windows-> Configurações de exceção). O atalho ainda é Ctrl- Alt- E.

A maneira mais simples de lidar com exceções personalizadas é selecionar "todas as exceções que não estão nesta lista".

Aqui está uma captura de tela da versão em inglês:

insira a descrição da imagem aqui

Aqui está uma captura de tela da versão alemã:

insira a descrição da imagem aqui

Principiante
fonte
16

A partir do Visual Studio 2015, você precisa ir para a caixa de diálogo "Configurações de exceção" ( Ctrl+ Alt+ E) e marcar as "Exceções de Common Language Runtime" (ou uma exceção específica que você deseja, por exemplo ArgumentNullException) para interromper as exceções manipuladas .

Etapa 1 Passo 1 Etapa 2 Passo 2

Sameer Alibhai
fonte
8

Verifique Gerenciando exceções com a página Depurador , explica como configurar isso.

Essencialmente, aqui estão as etapas (durante a depuração):

  1. No menu Debug, clique em Exceptions.

  2. Na caixa de diálogo Exceções, selecione Lançada para uma categoria inteira de exceções, por exemplo, Common Language Runtime Exceptions.

    -ou-

    Expanda o nó para uma categoria de exceções, por exemplo, Common Language Runtime Exceptions e selecione Lançado para uma exceção específica dentro dessa categoria.

Guy Starbuck
fonte
1

Uma técnica que eu uso é algo como o seguinte. Defina uma variável global que você pode usar para uma ou várias tentativas de blocos de captura, dependendo do que você está tentando depurar e use a seguinte estrutura:

if(!GlobalTestingBool)
{
   try
   {
      SomeErrorProneMethod();
   }
   catch (...)
   {
      // ... Error handling ...
   }
}
else
{
   SomeErrorProneMethod();
}

Acho que isso me dá um pouco mais de flexibilidade em termos de teste, porque ainda existem algumas exceções que não quero que o IDE interrompa.

Spencer Ruport
fonte
3
Essa é uma técnica útil - transforma a exceção tratada em uma exceção não tratada, para que o depurador a interrompa automaticamente. Não sei ao certo por que a votação foi reduzida, a menos que não haja uma boa maneira de definir seu GlobalTestingBool. Outra opção, possivelmente melhor, é usar Debugger.IsAttached.
18110 Joe White
Você teria que adicionar isso a cada tentativa / captura e recompilar seu código. Não é muito útil se você já está no meio da depuração de algo.
Max
Uma exceção deve ser lançada no código se houver uma condição excepcional - algo inaceitável - e deve ser capturada em um nível em que uma decisão possa ser tomada sobre como lidar com ela. Um código como esse complica os caminhos de execução.
Lee Oades
Eu sei que essa é uma resposta muito antiga, mas para googlers aleatórios como eu, você pode simplesmente adicionarcatch(){/*handle or not*/ throw; } // throw without any exception specified will rethrow original exception with original callstack etc
Jan 'splite' K.
0

A documentação on-line parece um pouco obscura, então acabei de realizar um pequeno teste. Optar por interromper Lançado na caixa de diálogo Exceções faz com que a execução do programa seja interrompida em qualquer exceção, tratada ou não. Se você deseja quebrar apenas as exceções manipuladas, parece que seu único recurso é passar pelo seu código e colocar pontos de interrupção em todas as suas exceções manipuladas. Isso parece um pouco excessivo; portanto, é melhor adicionar uma instrução de depuração sempre que você manipular uma exceção. Então, quando você vir essa saída, poderá definir um ponto de interrupção nessa linha no código.

markysdad
fonte