Lorsque vous utilisez Gestion dans une application Microsoft Windows Forms des exceptions structuré, l'exception peut ne propage pas correctement à la fonction appelante. Ce problème peut se produire si vous exécutez votre application Windows Forms sans l'utilisation du débogueur. Lorsque ce problème se produit, le message d'erreur suivant peut s'afficher :
Une exception non gérée s'est produite dans votre application. Si vous cliquez sur Continuer, l'application va ignorer cette erreur et tenter de continuer. Si vous cliquez sur Quitter l'application va s'arrêter immédiatement. Mon exception
Toutefois, si vous exécutez votre application Windows Forms avec le débogueur, vous ne pouvez pas recevoir ce message d'erreur.
Lorsque vous exécutez votre application Windows Forms sans l'utilisation du débogueur, vous utilisez la méthode NativeWindow.CallBack pour intercepter l'exception et pour empêcher le programme de fermeture inattendue (blocage). Dans la méthode NativeWindow.CallBack , vous remplir le message d'exception via une boîte de dialogue Exceptions standard.
Toutefois, si vous exécutez votre Windows Forms application avec le débogueur, vous ne catch pas l'exception car vous utilisez la méthode NativeWindow.DebuggableCallBack . Lorsque vous utilisez la méthode NativeWindow.DebuggableCallBack , le débogueur juste-à-temps (JIT) cesse de l'application.
Pour contourner ce problème, procédez comme suit :
Dans Microsoft Visual Studio .NET, ouvrir les formulaires Windows projet.
Cliquez sur Explorateur de solutions .
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le projet, pointez sur Ajouter et puis cliquez sur Ajouter un nouvel élément . La boîte de dialogue Nouvel élément s'affiche.
Effectuez l'une des suivantes, selon la version de Visual Studio .NET que vous avez :
Dans Visual Studio .NET 2003, cliquez sur fichier de configuration application sous modèle , puis cliquez sur Ouvrir .
Dans Visual Studio .NET 2002, cliquez sur fichiers XML sous modèle , tapez App.config dans la zone Nom et puis cliquez sur Ouvrir .
Le fichier App.config s'ouvre dans Visual Studio .NET IDE.
Dans le fichier App.config, remplacez le code existant par le code suivant.
Dans le menu Générer , cliquez sur Créer solution .
Appuyez sur CTRL + F5 pour exécuter l'application sans utiliser le débogueur.
Une autre solution de contournement à ce problème consiste à utiliser le Gestionnaire de Application.OnThreadException . Ajoutez le code suivant à la classe Form1 . Ce code fonctionne de la même manière avec le débogueur et sans le débogueur.
[STAThread]
static void Main()
{
CustomExceptionHandler eh = new CustomExceptionHandler();
Application.ThreadException += new ThreadExceptionEventHandler(eh.OnThreadException);
Application.Run(new Form1());
}
internal class CustomExceptionHandler
{
public void OnThreadException(object sender, ThreadExceptionEventArgs t)
{
// MessageBox.Show("OnThreadException - Handling the following exception: \n \n" + t.Exception.Message);
throw t.Exception;
}
}
Dans le menu Fichier , pointez sur Nouveau , puis cliquez sur projet . La boîte de dialogue Nouveau projet s'affiche.
Sous types de projets , cliquez sur projets Visual C# . Sous modèles , cliquez sur Windows Application projets. Cliquez sur OK . Par défaut, un formulaire est nommé Form1 est créé.
Basculer vers l'affichage code.
Dans le formulaire Form1, remplacez le code existant par le code suivant.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace WindowsApplication1
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
/// <summary>
/// Windows Form Designer requires this variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows Form Designer requires this method.
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call.
//
}
/// <summary>
/// Clean up any resources that are being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Windows Form Designer requires this method. Do not modify
/// the contents of this method by using the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(64, 104);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(160, 40);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
try
{
Application.Run(new Form1());
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button1_Click(object sender, System.EventArgs e)
{
try
{
Form2 frm = new Form2();
frm.Show();
}
catch (System.Exception exc)
{
MessageBox.Show("Handling the following exception: \n \n" + exc.Message);
}
}
}
}
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le projet, pointez sur Ajouter et puis cliquez sur Ajouter un nouvel élément . La boîte de dialogue Ajouter un nouvel élément s'affiche.
Sous modèles , cliquez sur Windows Form . Par défaut, un formulaire est nommé Form2 est créé.
Dans l'écran avant Form2, remplacez le code existant par le code suivant.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace WindowsApplication1
{
/// <summary>
/// Summary description for Form2.
/// </summary>
public class Form2 : System.Windows.Forms.Form
{
/// <summary>
/// Windows Form Designer requires this variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form2()
{
//
// Windows Form Designer requires this method.
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call.
//
}
/// <summary>
/// Clean up any resources that are being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Windows Form Designer requires this method. Do not modify
/// the contents of this method by using the code editor.
/// </summary>
private void InitializeComponent()
{
//
// Form2
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Name = "Form2";
this.Text = "Form2";
this.Load += new System.EventHandler(this.Form2_Load);
}
#endregion
private void Form2_Load(object sender, System.EventArgs e)
{
throw new System.Exception("My Exception");
}
}
}
Dans le menu Générer , cliquez sur Créer solution . Ensuite, appuyez sur CTRL + F5 pour exécuter l'application sans utiliser le débogueur.
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 836674
(http://support.microsoft.com/kb/836674/en-us/
)
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.