Excepções não processadas eventos de formulário do Windows não são propagadas de 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 324653
Sintomas
Excepções não processadas que ocorrem em eventos de formulário do Windows não são propagadas para cima a pilha de chamadas para um processador de excepções estruturados no processo de chamada.
Causa
O Microsoft de .NET Framework molda-se a bomba de mensagem num processador de excepções. O .NET Framework só processa excepções que chegar a bomba de mensagem e que a aplicação já não foi processado. Por conseguinte, qualquer excepção não processada que atinge a mensagem não está propagada bomba até a pilha de chamadas.
Resolução
Para resolver este problema, crie um processador de excepções para as excepções não processadas chamando o método de Application.AddOnThreadException e passando o método Application.ThreadException uma referência a um método na sua aplicação. Este método denomina-se, em seguida, para quaisquer excepções não processadas que ocorrem em que o thread. O evento OnThreadException é desencadeado quando o procedimento de janela Windows Forms recebe uma excepção.

Os passos seguintes e o código de exemplo demonstram como utilizar o método Application.AddOnThreadException para tratar estas excepções.

A Microsoft fornece exemplos de programação apenas a título ilustrativo, sem garantia expressa ou implícita. Isto inclui, mas não está limitado a, garantias implícitas de comercialização ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação que está a ser demonstrada e com as ferramentas que são utilizadas para criar e depurar procedimentos. Técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas do utilizador.
  1. Repita os passos 1 a 7 na secção "Passos para reproduzir theBehavior".
  2. Visualize o código de classe Form1.
  3. Expanda a região de generatedcode do estruturador de formulários do Windows .
  4. Substitua o 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 projecto , clique em Adicionar classe.
  6. Na caixa nome , escreva ExceptionHandler.vbe thenclick aberto.
  7. Substitua o código da nova classe de ExceptionHandler com o seguinte código:
    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 Depurar , clique em Start Without Debugging.
  9. Clique no botão de comando. Repare que recebe mensagem de thefollowing:
    Processadas a followingexception:

    A excepção
Ponto Da Situação
Este comportamento ocorre por predefinição.
Mais Informação

Passos para reproduzir o comportamento

  1. Siga estes passos para criar um novo Applicationproject do Windows no Visual Basic de .NET:
    1. Inicie o Microsoft Visual Studio .NET.
    2. Sobre o Ficheiro menu, aponte para Novoe, em seguida, clique em Projecto.
    3. Do Novo projecto caixa de diálogo, clique em Projectos do Visual Basic em Tipos de projectoe, em seguida, clique em Aplicação do Windows em Modelos. Por predefinição, é criado o Form1.
  2. Arrastar um Botão controlo da caixa de ferramentas ao Form1.
  3. Sobre o Vista menu, clique em Código para visualizar o módulo de classe de formulário.
  4. Adicione o seguinte código para o Button1_Click processador de eventos:
    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. Sobre o Projecto menu, clique em Adicionar formulário de Windows. Clique em OK para aceitar o nome predefinido (formulário2) para o novo formulário.
  6. Sobre o Vista menu, clique em Código.
  7. Adicione o seguinte código para o Form2_Load processador de eventos:
    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. Sobre o Depuração menu, clique em Iniciar sem depuração.
  9. Clique no botão de comando. Repare que recebe mensagem de erro thefollowing:
    Hasoccurred uma excepção não processada na aplicação. Se continuar, a aplicação vai ignorar thiserror e tentar continuar. Se clicar em sair, a aplicação vai ser encerrado imediatamente.

    A excepção.
Este comportamento parece estar incorrecto porque existe um processador de excepções estruturada ao chamar o procedimento de Form1. No entanto, dado que a pilha de chamadas contém uma bomba de mensagem, a excepção não é propagada para cima a pilha de chamadas e o processador de excepções no Form1 não processa a excepção. Se iniciar a aplicação com o depurador anexado, a excepção é processada. Quando o depurador for anexado ao processo, a excepção é processada correctamente porque existem duas bombas de mensagem que alllow a mensagem se propaguem para cima da pilha de chamadas.
pilha de chamadas

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 324653 - Última Revisão: 10/29/2015 00:12:00 - Revisão: 7.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

  • kbnetframe100presp3fix kbprb kbmt KB324653 KbMtpt
Comentários