Dépannage des exceptions : System.InvalidOperationException
Une exception InvalidOperationException est levée si une méthode d'un objet est appelée quand l'état de l'objet ne peut pas prendre en charge l'appel de méthode. L'exception est également levée quand une méthode tente de manipuler l'interface utilisateur à partir d'un autre thread que le thread principal ou le thread d'interface utilisateur.
Important
Dans la mesure où des exceptions InvalidOperationException peuvent être levées dans un grand nombre de situations différentes, il est important de lire et de comprendre le Message affiché dans l'Assistant Exception.
Dans cet article
Une méthode qui s'exécute sur un autre thread qu'un thread d'interface utilisateur met à jour l'interface utilisateur
Une instruction d'un bloc foreach (For Each en Visual Basic) change la collection dans laquelle elle itère
Un Nullable<T> qui a la valeur Null fait l'objet d'un transtypage en T
Une méthode System.Linq.Enumerable est appelée sur une collection vide
Articles connexes
Les exemples de code de cet article vous montrent comment certaines exceptions InvalidOperationException communes peuvent se produire dans votre application. La façon dont vous gérez ces problèmes dépend de chaque situation. Si l'exception est irrécupérable pour les fonctionnalités de votre application, vous pouvez éventuellement utiliser une construction try … catch (Try … Catch en Visual Basic) pour capturer l'exception et nettoyer l'état de l'application avant de quitter cette dernière. Toutefois, d'autres exceptions InvalidOperationException peuvent être anticipées et évitées. Les exemples de méthode modifiée illustrent certaines de ces techniques.
Une méthode qui s'exécute sur un autre thread qu'un thread d'interface utilisateur met à jour l'interface utilisateur
Levée d'une exception InvalidOperationException avec une mise à jour de l'interface utilisateur à partir d'un autre thread qu'un thread d'interface utilisateur | Éviter les exceptions InvalidOperationException sur les autres threads que les threads d'interface utilisateur
La plupart des infrastructures d'application d'interface graphique utilisateur .NET, par exemple Windows Forms et Windows Presentation Foundation (WPF), vous permettent d'accéder aux objets d'interface graphique utilisateur uniquement à partir du thread qui crée et gère l'interface utilisateur (le thread principal ou le thread d'interface utilisateur). Une exception InvalidOperationException est levée quand vous essayez d'accéder à un élément d'interface utilisateur à partir d'un thread qui n'est pas le thread d'interface utilisateur.
Levée d'une exception InvalidOperationException avec une mise à jour de l'interface utilisateur à partir d'un autre thread qu'un thread d'interface utilisateur
Notes
Les exemples suivants utilisent le Modèle asynchrone basé sur les tâches (TAP, Task-based Asynchronous Pattern) pour créer d'autres threads que des threads d'interface utilisateur.Toutefois, ces exemples sont également pertinents pour tous les Modèles de programmation asynchrone .NET.
Dans ces exemples, le gestionnaire d'événements ThreadsExampleBtn_Click appelle deux fois la méthode DoSomeWork. Le premier appel à la méthode (DoSomeWork(20);) s'exécute de manière synchrone et réussit. Mais le deuxième appel (Task.Run( () => { DoSomeWork(1000);});) s'exécute sur un thread du pool de threads de l'application. Dans la mesure où cet appel tente de mettre à jour l'interface utilisateur à partir d'un autre thread qu'un thread d'interface utilisateur, l'instruction lève une exception InvalidOperationException.
Applications WPF et applications de Store
Notes
Dans les applications téléphoniques de Store, une exception Exception est levée à la place de l'exception plus spécifique InvalidOperationException.
Messages d'exception :
Applications WPF |
Informations supplémentaires : le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire. |
Applications de Store |
Informations supplémentaires : l'application a appelé une interface qui était maintenue en ordre pour un thread différent. (Exception de HRESULT : 0x8001010E (RPC_E_WRONG_THREAD)) |
private async void ThreadsExampleBtn_Click(object sender, RoutedEventArgs e)
{
TextBox1.Text = String.Empty;
TextBox1.Text = "Simulating work on UI thread.\n";
DoSomeWork(20);
TextBox1.Text += "Simulating work on non-UI thread.\n";
await Task.Run(() => DoSomeWork(1000));
TextBox1.Text += "ThreadsExampleBtn_Click completes. ";
}
private void DoSomeWork(int msOfWork)
{
// simulate work
var endTime = DateTime.Now.AddMilliseconds(msOfWork);
while (DateTime.Now < endTime)
{
// spin
};
// report completion
var msg = String.Format("Some work completed in {0} ms on UI thread. \n", msOfWork);
TextBox1.Text += msg;
}
Applications Windows Forms
Message d'exception :
- Informations supplémentaires : opération inter-threads non valide : le contrôle 'TextBox1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
private async void ThreadsExampleBtn_Click(object sender, EventArgs e)
{
TextBox1.Text = String.Empty;
var tbLinesList = new List<string>() {"Simulating work on UI thread."};
TextBox1.Lines = tbLinesList.ToArray();
DoSomeWork(20, tbLinesList);
tbLinesList.Add("Simulating work on non-UI thread.");
TextBox1.Lines = tbLinesList.ToArray();
await Task.Run(() => DoSomeWork(1000, tbLinesList));
tbLinesList.Add("ThreadsExampleBtn_Click completes.");
TextBox1.Lines = tbLinesList.ToArray();
}
private void DoSomeWork(int msOfWork, List<string> tbLinesList)
{
// simulate work
var endTime = DateTime.Now.AddMilliseconds(msOfWork);
while (DateTime.Now < endTime) { };
{
// spin
};
// report completion
var msg = String.Format("Some work completed in {0} ms on UI thread. \n", msOfWork);
tbLinesList.Add(msg);
TextBox1.Lines = tbLinesList.ToArray();
}
Dans cet articleDans cette section
Éviter les exceptions InvalidOperationException sur les autres threads que les threads d'interface utilisateur
Les infrastructures d'interface utilisateur Windows implémentent un modèle de répartiteur qui inclut une méthode permettant de vérifier si l'appel d'un membre d'élément d'interface utilisateur est en cours d'exécution sur le thread d'interface utilisateur, ainsi que d'autres méthodes permettant de planifier l'appel sur le thread d'interface utilisateur.
Applications WPF
Dans les applications WPF, utilisez l'une des méthodes Dispatcher.Invoke pour exécuter un délégué sur le thread d'interface utilisateur. Si nécessaire, utilisez la méthode Dispatcher.CheckAccess pour déterminer si une méthode est en cours d'exécution sur un autre thread qu'un thread d'interface utilisateur.
private void DoSomeWork(int msOfWork)
{
var endTime = DateTime.Now.AddMilliseconds(msOfWork);
while (DateTime.Now < endTime)
{
// spin
};
// report completion
var msgFormat = "Some work completed in {0} ms on {1}UI thread.\n";
var msg = String.Empty;
if (TextBox1.Dispatcher.CheckAccess())
{
msg = String.Format(msgFormat, msOfWork, String.Empty);
TextBox1.Text += msg;
}
else
{
msg = String.Format(msgFormat, msOfWork, "non-");
Action act = ()=> {TextBox1.Text += msg;};
TextBox1.Dispatcher.Invoke(act);
}
}
Applications Windows Forms
Dans les applications Windows Forms, utilisez la méthode Control.Invoke pour exécuter un délégué qui met à jour le thread d'interface utilisateur. Si nécessaire, utilisez la propriété Control.InvokeRequired pour déterminer si une méthode est en cours d'exécution sur un autre thread qu'un thread d'interface utilisateur.
private void DoSomeWork(int msOfWork, List<string> tbLinesList)
{
// simulate work
var endTime = DateTime.Now.AddMilliseconds(msOfWork);
while (DateTime.Now < endTime)
{
// spin
};
// report completion
var msgFormat = "Some work completed in {0} ms on {1}UI thread.\n";
var msg = String.Empty;
if (TextBox1.InvokeRequired)
{
msg = String.Format(msgFormat, msOfWork, "non-");
tbLinesList.Add(msg);
Action act = () => TextBox1.Lines = tbLinesList.ToArray();
TextBox1.Invoke( act );
}
else
{
msg = String.Format(msgFormat, msOfWork, String.Empty);
tbLinesList.Add(msg);
TextBox1.Lines = tbLinesList.ToArray();
}
}
Applications de Store
Dans les applications de Store, utilisez la méthode CoreDispatcher.RunAsync pour exécuter un délégué qui met à jour le thread d'interface utilisateur. Si nécessaire, utilisez la propriété HasThreadAccess pour déterminer si une méthode est en cours d'exécution sur un autre thread qu'un thread d'interface utilisateur.
private void DoSomeWork(int msOfWork)
{
// simulate work
var endTime = DateTime.Now.AddMilliseconds(msOfWork);
while (DateTime.Now < endTime)
{
// spin
};
// report completion
var msgFormat = "Some work completed in {0} ms on {1}UI thread.\n";
var msg = String.Empty;
if (TextBox1.Dispatcher.HasThreadAccess)
{
msg = String.Format(msgFormat, msOfWork, String.Empty);
TextBox1.Text += msg;
}
else
{
msg = String.Format(msgFormat, msOfWork, "non-");
TextBox1.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
()=> {TextBox1.Text += msg;});
}
}
Dans cet articleDans cette section
Une instruction d'un bloc foreach (For Each en Visual Basic) change la collection dans laquelle elle itère
Levée d'une exception InvalidOperationException avec foreach | Éviter les exceptions InvalidOperationException dans les boucles
Une instruction foreach (For Each en Visual Basic) répète un groupe d'instructions intégrées pour chaque élément d'un tableau ou d'une collection qui implémente l'interface IEnumerable ou IEnumerable. La déclaration foreach sert à itérer la collection pour lire et modifier les éléments. Toutefois, elle ne peut pas être utilisée pour ajouter ou supprimer des éléments dans la collection. Une exception InvalidOperationException est levée si vous ajoutez ou supprimez des éléments dans la collection source d'une instruction foreach.
Levée d'une exception InvalidOperationException avec foreach
Dans cet exemple, une exception InvalidOperationException est levée quand l'instruction numList.Add(5); tente de changer la liste dans le bloc foreach.
Message d'exception :
- Informations supplémentaires : la collection a été modifiée ; l'opération d'énumération peut ne pas s'exécuter.
private void AddElementsToAList()
{
var numList = new List<int>() { 1, 2, 3, 4 };
foreach (var num in numList)
{
if (num == 2)
{
numList.Add(5);
}
}
// Display list elements
foreach (var num in numList)
{
Console.Write("{0} ", num);
}
}
Dans cet articleDans cette section
Éviter les exceptions InvalidOperationException dans les boucles
Important
L'ajout ou la suppression d'éléments dans une liste durant une itération dans la collection peut avoir des conséquences non souhaitées et difficiles à prévoir.Si possible, évitez d'effectuer l'opération durant l'itération.
private void AddElementsToAList ()
{
var numList = new List<int>() { 1, 2, 3, 4 };
var numberOf2s = 0;
foreach (var num in numList)
{
if (num == 2)
{
numberOf2s++;
}
}
for (var i = 0; i < numberOf2s; i++ )
{
numList.Add(5);
}
// Display list elements
foreach (var num in numList)
{
Console.Write("{0} ", num);
}
}
Si vous êtes obligé d'ajouter ou de supprimer des éléments dans une liste durant une itération dans une collection, utilisez une boucle for (For en Visual Basic) :
private void AddElementsToAList ()
{
var numList = new List<int>() { 1, 2, 3, 4 };
for (var i = 0; i < numList.Count; i++)
{
if (numList[i] == 2)
{
numList.Add(5);
}
}
// Display list elements
foreach (var num in numList)
{
Console.Write("{0} ", num);
}
}
Dans cet articleDans cette section
Un Nullable<T> qui a la valeur Null fait l'objet d'un transtypage en T
Levée d'une exception InvalidOperationException avec un transtypage non valide | Éviter l'exception InvalidOperationException à partir d'un transtypage incorrect
Si vous effectuez le transtypage d'une structure Nullable qui a la valeur null (Nothing en Visual Basic) vers son type sous-jacent, une exception InvalidOperationException est levée.
Levée d'une exception InvalidOperationException avec un transtypage non valide
Dans cette méthode, une exception InvalidOperationException est levée quand la méthode Select effectue le transtypage d'un élément Null de dbQueryResults vers un type int.
Message d'exception :
- Informations supplémentaires : un objet qui autorise la valeur Null doit posséder une valeur.
private void MapQueryResults()
{
var dbQueryResults = new int?[] { 1, 2, null, 4 };
var ormMap = dbQueryResults.Select(nullableInt => (int)nullableInt);
//display map list
foreach (var num in ormMap)
{
Console.Write("{0} ", num);
}
Console.WriteLine();
}
Dans cet articleDans cette section
Éviter l'exception InvalidOperationException à partir d'un transtypage incorrect
Pour éviter InvalidOperationException :
Utilisez la propriété Nullable.HasValue pour sélectionner uniquement les éléments qui n'ont pas la valeur Null.
Utilisez l'une des méthodes Nullable.GetValueOrDefault surchargées pour fournir une valeur par défaut pour un élément Null.
Exemple Nullable<T>.HasValue
private void MapQueryResults()
{
var dbQueryResults = new int?[] { 1, 2, null, 4 };
var ormMap = dbQueryResults
.Where(nulllableInt => nulllableInt.HasValue)
.Select(num => (int)num);
//display map list
foreach (var num in ormMap)
{
Console.Write("{0} ", num);
}
Console.WriteLine();
// handle nulls
Console.WriteLine("{0} nulls encountered in dbQueryResults",
dbQueryResults.Where(nullableInt => !nullableInt.HasValue).Count());
}
Exemple Nullable<T>.GetValueOrDefault
Dans cet exemple, nous utilisons GetValueOrDefault(UTP) pour spécifier une valeur par défaut située en dehors des valeurs attendues retournées par dbQueryResults.
private void MapQueryResults()
{
var dbQueryResults = new int?[] { 1, 2, null, 4 };
var nullFlag = int.MinValue;
var ormMap = dbQueryResults.Select(nullableInt => nullableInt.GetValueOrDefault(nullFlag));
// handle nulls
Console.WriteLine("'{0}' indicates a null database value.", nullFlag);
foreach (var num in ormMap)
{
Console.Write("{0} ", num);
}
Console.WriteLine();
}
Dans cet articleDans cette section
Une méthode System.Linq.Enumerable est appelée sur une collection vide
Les méthodes Enumerable Aggregate, Average, Last, Max, Min, First, Single et SingleOrDefault effectuent des opérations sur une séquence et ne retournent qu'un seul résultat.
Certaines surcharges de ces méthodes lèvent une exception InvalidOperationException quand la séquence est vide (d'autres surcharges retournent null (Nothing en Visual Basic). SingleOrDefault lève également InvalidOperationException quand la séquence contient plusieurs éléments.
Conseil
La plupart des méthodes Enumerable décrites dans cette section sont surchargées.Vous devez bien comprendre le comportement de la surcharge que vous choisissez.
Messages d'exception :
Méthodes Aggregate, Average, Last, Max et Min | Méthodes First et FirstOrDefault | Méthodes Single et SingleOrDefault
Méthodes Aggregate, Average, Last, Max et Min
- Informations supplémentaires : la séquence ne contient aucun élément.
Levée d'une exception InvalidOperationException avec Average
Dans cet exemple, la méthode suivante lève une exception InvalidOperationException quand elle appelle la méthode Average, car l'expression Linq retourne une séquence qui ne contient aucun élément supérieur à 4.
private void FindAverageOfNumbersGreaterThan4()
{
var dbQueryResults = new[] { 1, 2, 3, 4 };
var avg = dbQueryResults.Where(num => num > 4).Average();
Console.WriteLine("The average value numbers greater than 4 in the returned records is {0}", avg);
}
Quand vous utilisez l'une de ces méthodes sans rechercher la présence d'une séquence vide, vous supposez implicitement que la séquence n'est pas vide et qu'une séquence vide est un événement inattendu. L'interception ou la levée d'une exception est appropriée quand vous supposez que la séquence n'est pas vide.
Éviter une exception InvalidOperationException causée par une séquence vide
Utilisez l'une des méthodes Enumerable.Any pour vérifier si la séquence est vide.
Conseil
L'utilisation de Any peut améliorer les performances de la vérification si la séquence dont la moyenne est à calculer peut contenir un grand nombre d'éléments, ou si l'opération qui génère la séquence est coûteuse.
private void FindAverageOfNumbersGreaterThan4()
{
var dbQueryResults = new[] { 1, 2, 3, 4 };
var moreThan4 = dbQueryResults.Where(num => num > 4);
if(moreThan4.Any())
{
var msgFormat = "The average value numbers greater than 4 in the returned records is {0}";
Console.WriteLine(msgFormat, moreThan4.Average());
}
else
{
// handle empty collection
Console.WriteLine("There are no values greater than 4 in the ecords.");
}
}
Dans cet articleDans cette section
Méthodes First et FirstOrDefault
First retourne le premier élément d'une séquence ou lève une exception InvalidOperationException si la séquence est vide. Vous pouvez appeler la méthode FirstOrDefault à la place de First pour retourner une valeur spécifique ou par défaut au lieu de lever l'exception.
Notes
Dans le .NET Framework, les types possèdent un concept de valeurs par défaut.Ainsi, la valeur par défaut d'un type référence est Null, et celle d'un type entier est zéro.Voir Tableau des valeurs par défaut (référence C#)
Levée d'une exception InvalidOperationException avec First
First est une méthode d'optimisation qui retourne le premier élément d'une séquence qui répond à une condition spécifique. Si aucun élément répondant à la condition n'est trouvé, les méthodes lèvent une exception InvalidOperationException.
Dans cet exemple, la méthode First lève l'exception, car dbQueryResults ne contient aucun élément supérieur à 4.
Message d'exception :
- Informations supplémentaires : la séquence ne contient aucun élément correspondant.
private void FindANumbersGreaterThan4()
{
var dbQueryResults = new[] { 1, 2, 3, 4 };
var firstNum = dbQueryResults.First(n=> n > 4);
var msgFormat = "{0} is an element of dbQueryResults that is greater than 4";
Console.WriteLine(msgFormat, firstNum);
}
Éviter une exception avec FirstOrDefault
Vous pouvez utiliser l'une des méthodes FirstOrDefault à la place de First pour vérifier que la séquence firstNum contient au moins un élément. Si la requête ne trouve aucun élément répondant à la condition, elle retourne une valeur spécifique ou par défaut. Vous pouvez vérifier la valeur retournée pour déterminer si des éléments ont été trouvés.
Notes
L'utilisation de FirstOrDefault peut être plus compliquée à mettre en œuvre si la valeur par défaut du type est un élément valide dans la séquence.
private void FindANumbersGreaterThan4()
{
var dbQueryResults = new[] { 1, 2, 3, 4 };
// default(object) == null
var firstNum = dbQueryResults.FirstOrDefault(n => n > 4);
if (firstNum != 0)
{
var msgFormat = "{0} is an element of dbQueryResults that is greater than 4";
Console.WriteLine(msgFormat, firstNum);
}
else
{
// handle default case
Console.WriteLine("No element of dbQueryResults is greater than 4.");
}
}
Dans cet articleDans cette section
Méthodes Single et SingleOrDefault
Les méthodes Enumerable.Single retournent le seul élément d'une séquence, ou le seul élément d'une séquence qui répond au test spécifié.
S'il n'y a aucun élément dans la séquence, ou s'il existe plusieurs éléments dans cette dernière, la méthode lève une exception InvalidOperationException.
Vous pouvez utiliser SingleOrDefault pour retourner une valeur spécifique ou par défaut au lieu de lever l'exception quand la séquence ne contient aucun élément. Toutefois, SingleOrDefault lève toujours une exception InvalidOperationException quand la séquence contient plusieurs éléments qui correspondent au prédicat de sélection.
Notes
Dans le .NET Framework, les types possèdent un concept de valeurs par défaut.Ainsi, la valeur par défaut d'un type référence est Null, et celle d'un type entier est zéro.Voir Tableau des valeurs par défaut (référence C#)
Levée d'exceptions InvalidOperationException avec Single
Dans cet exemple, singleObject lève une exception InvalidOperationException, car dbQueryResults ne contient aucun élément supérieur à 4.
Message d'exception :
- Informations supplémentaires : la séquence ne contient aucun élément correspondant.
private void FindTheOnlyNumberGreaterThan4()
{
var dbQueryResults = new[] { (object)1, (object)2, (object)3, (object)4 };
var singleObject = dbQueryResults.Single(obj => (int)obj > 4);
// display results
var msgFormat = "{0} is the only element of dbQueryResults that is greater than 4";
Console.WriteLine(msgFormat, singleObject);
}
Levée d'exceptions InvalidOperationException avec Single ou SingleOrDefault
Dans cet exemple, singleObject lève une exception InvalidOperationException, car dbQueryResults contient plusieurs éléments supérieurs à 2.
Message d'exception :
- Informations supplémentaires : la séquence contient plusieurs éléments correspondants.
private void FindTheOnlyNumberGreaterThan2()
{
var dbQueryResults = new[] { (object)1, (object)2, (object)3, (object)4 };
var singleObject = dbQueryResults.SingleOrDefault(obj => (int)obj > 2);
if (singleObject != null)
{
var msgFormat = "{0} is the only element of dbQueryResults that is greater than 2";
Console.WriteLine(msgFormat, singleObject);
}
else
{
// handle empty collection
Console.WriteLine("No element of dbQueryResults is greater than 2.");
}
}
Éviter les exceptions InvalidOperationException avec Single
Single et SingleOrDefault représentent également une documentation de vos intentions. Single implique clairement que vous vous attendez à ce que la condition ne retourne qu'un et un seul résultat. SingleOrDefault indique que vous vous attendez à un seul résultat, voire aucun, mais rien d'autre. Quand ces conditions ne sont pas valides, la levée ou l'interception de l'exception InvalidOperationException est appropriée. Toutefois, si vous vous attendez à ce que des conditions non valides se produisent à une certaine fréquence, utilisez d'autres méthodes Enumerable, telles que First ou Where, pour générer vos résultats.
Durant le développement, vous pouvez utiliser l'une des méthodes Assert pour vérifier vos hypothèses. Dans cet exemple, le code en surbrillance provoque l'arrêt du débogueur et l'affichage d'une boîte de dialogue d'assertion durant le développement. L'assertion est supprimée du code de version. Par ailleurs, Single est levé si les résultats ne sont pas valides.
Notes
L'utilisation de Take``1 et l'affectation de la valeur 2 à son paramètre count limite la séquence retournée à deux éléments au maximum.Cette séquence inclut tous les cas que vous devez vérifier (0, 1 et plus de 1 élément). En outre, elle peut améliorer les performances de la vérification quand la séquence contient parfois un grand nombre d'éléments ou quand l'opération qui génère la séquence est coûteuse.
private void FindTheOnlyNumberGreaterThan4()
{
var dbQueryResults = new[] { (object)1, (object)2, (object)3, (object)4 };
var moreThan4 = dbQueryResults.Where(obj => (int)obj > 4).Take(2);
System.Diagnostics.Debug.Assert(moreThan4.Count() == 1,
String.Format("moreThan4.Count() == 1; Actual count: {0}", moreThan4.Count()));
// do not handle exceptions in release code
Console.WriteLine("{0} is the only element of dbQueryResults that is greater than 4",
moreThan4.Single());
}
Si vous souhaitez éviter l'exception tout en gérant les états non valides dans le code de version, changez la technique décrite ci-dessus. Dans cet exemple, la méthode répond au nombre d'éléments retournés par moreThan2 dans l'instruction switch.
private void FindTheOnlyNumberGreaterThan2()
{
var dbQueryResults = new[] { (object)1, (object)2, (object)3, (object)4 };
var moreThan2 = dbQueryResults.TakeWhile(obj => (int)obj > 2).Take(2);
switch(moreThan2.Count())
{
case 1:
// success
var msgFormat = "{0} is the only element of dbQueryResults that is greater than 2";
Console.WriteLine(msgFormat, moreThan2.Single());
break;
case 0:
// handle empty collection
Console.WriteLine("No element of the dbQueryResults are greater than 4.");
break;
default: // count > 1
// handle more than one element
Console.WriteLine("More than one element of dbQueryResults is greater than 4");
break;
}
}
Dans cet articleDans cette section
Articles connexes
Instructions de conception pour les exceptions (Instruction de conception .NET Framework)
Gestion et levée des exceptions (Notions de base de l'application .NET Framework)
Procédure : gérer des exceptions dans une requête PLINQ (guide de développement .NET Framework)
Exceptions dans les threads gérés (guide de développement .NET Framework)
Exceptions et gestion des exceptions (guide de programmation C#)
Instructions de gestion des exceptions (référence C#)
Instruction Try...Catch...Finally (Visual Basic)
Gestion des exceptions (bibliothèque parallèle de tâches)
Gestion des exceptions (débogage)
Procédure : gérer des erreurs et des exceptions qui se produisent avec Databinding (Windows Forms)
Gestion des exceptions dans les applications réseau (XAML) (Windows)
Dans cet article