Você está offline; aguardando reconexão

Exceções sem tratamento em eventos de formulário do Windows não são propagadas até a pilha de chamadas

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 324653
Sintomas
Exceções sem tratamento que ocorrem em eventos de formulário do Windows não são propagadas na pilha de chamadas para um manipulador de exceção estruturada no procedimento de chamada.
Causa
O Microsoft .NET Framework encapsula a bomba de mensagem em um manipulador de exceção. O .NET Framework somente manipula as exceções que chegar a bomba de mensagem e que o aplicativo já não foi tratada. Portanto, qualquer exceção que a mensagem chega sem tratamento bomba não é propagada na pilha de chamadas.
Resolução
Para resolver esse problema, crie um manipulador de exceção para suas exceções sem tratamento por chamar o método Application.AddOnThreadException e passando o método Application.ThreadException uma referência a um método em seu aplicativo. Este método é chamado, em seguida, para todas as exceções sem tratamento que ocorrem no thread. O evento OnThreadException é gerado quando o procedimento de janela Windows Forms recebe uma exceção.

As seguintes etapas e código de exemplo demonstram como usar o método Application.AddOnThreadException para manipular essas exceções.

Microsoft fornece exemplos de programação apenas para ilustração, sem garantia expressa ou implícita. Isso inclui, mas não está limitado a, garantias implícitas de comercialização ou adequação para uma finalidade específica. Este artigo presume que você está familiarizados com a linguagem de programação que está sendo demonstrada e com as ferramentas que são usadas para criar e depurar procedimentos. Engenheiros de suporte podem ajudar a explicar a funcionalidade de um determinado procedimento, mas eles não modificarão esses exemplos para fornecer funcionalidades adicionais ou construir procedimentos para atender às suas necessidades.
  1. Repita as etapas 1 a 7 na seção "Passos para reproduzir o problema".
  2. Exiba o código para a classe Form1.
  3. Expanda a região de código gerado pelo Windows Form Designer .
  4. Substituir construtor Sub New() com o seguinte código:
    Public Sub New()   MyBase.New()   'This call is required by the Windows Form Designer.   InitializeComponent()   'Add any initialization after the InitializeComponent() call.   'Explicitly set apartment state to single-threaded apartment (STA).   System.Threading.Thread.CurrentThread.ApartmentState = System.Threading.ApartmentState.STA   Dim eh As New ExceptionHandler()   AddHandler Application.ThreadException, AddressOf eh.OnThreadExceptionEnd Sub					
  5. No menu Project , clique em Add Class .
  6. Na caixa nome , digite ExceptionHandler.vb e, em seguida, clique em Abrir .
  7. Substitua o código na nova classe ExceptionHandler com o código a seguir:
    Friend Class ExceptionHandler    Public Sub OnThreadException(ByVal Sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)        'Add custom exception handling code here.        MessageBox.Show("Handled the following exception:" & _            vbCrLf & vbCrLf & e.Exception.Message)    End SubEnd Class					
  8. No menu Debug , clique em Start Without Debugging .
  9. Clique no botão de comando. Observe que você recebe a seguinte mensagem:
    Manipuladas a seguinte exceção:

    Meu exceção
Situação
Esse comportamento é por design.
Mais Informações

Passos para reproduzir o problema

  1. Siga estas etapas para criar um novo Windows Application projeto em Visual Basic.NET:
    1. Inicie o Microsoft Visual Studio NET..
    2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
    3. Na caixa de diálogo New Project , clique em Projetos do Visual Basic em Project Types e clique em Windows Application em modelos . Por padrão, é criado o Form1.
  2. Arraste um controle de botão da caixa de ferramentas para Form1.
  3. No menu Exibir , clique em código para exibir o módulo de classe de formulário.
  4. Adicione o seguinte código ao manipulador de eventos Button1_Click :
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click   Dim f As New Form2()   Try      f.Show()   Catch exc As Exception      MessageBox.Show(exc.Message)   Finally      f.Close()   End TryEnd Sub					
  5. No menu Project , clique em Add Windows Form . Clique em OK para aceitar o nome padrão (Form2) para o novo formulário.
  6. No menu Exibir , clique em código .
  7. Adicione o seguinte código ao manipulador de eventos Form2_Load :
    Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load   Throw New System.Exception("My Exception")End Sub					
  8. No menu Debug , clique em Start Without Debugging .
  9. Clique no botão de comando. Observe que você recebe a seguinte mensagem de erro:
    Ocorreu uma exceção sem tratamento em seu aplicativo. Se você continuar, o aplicativo irá ignorar esse erro e tentará continuar. Se você clicar em encerrar, o aplicativo será encerrado imediatamente.

    Meu exceção.
Esse comportamento parece estar incorreto porque há um manipulador de exceção estruturada no procedimento de chamada no Form1. No entanto, como a pilha de chamadas contém uma bomba de mensagem, a exceção não é propagada na pilha de chamadas e o manipulador de exceção no Form1 não manipula a exceção. Se você iniciar o aplicativo com o depurador anexado, a exceção é tratada. Quando o depurador é anexado ao processo, a exceção é tratada corretamente porque há dois bombas de mensagem que alllow a mensagem para propagar até a pilha de chamadas.
pilha de chamadas

Propriedades

ID do Artigo: 324653 - Última Revisão: 05/09/2008 21:54:19 - Revisão: 6.0

Microsoft .NET Framework 1.1, Microsoft .NET Framework 1.0, Microsoft .NET Framework 2.0, Microsoft .NET Framework 3.0, Microsoft .NET Framework 3.5

  • kbmt kbnetframe100presp3fix kbprb KB324653 KbMtpt
Comentários
h.floor(Math.random() * 3)).toString(16)); var m = document.createElement("meta"); m.content = guid; m.name = "ms.dqid"; document.getElementsByTagName("head")[0].appendChild(m);