Des chercheurs danois et suédois en sciences informatiques et systèmes autonomes ont décortiqué la sécurité...
Nvidia se prépare à livrer la plate-forme serveur HGX-2 qui sera capable d'exploiter la puissance de 16 GPU Tesla V100...
L'EMD, une école de commerce située à Marseille ouvre à la prochaine rentrée l'école du numérique...
throw
try-catch
try-finally
try-catch-finally
throw
est :e
est une instance d'une classe dérivée de System.Exception
.
L'exemple suivant utilise l'instruction throw
pour lever une exception IndexOutOfRangeException
si l'argument passé à une méthode nommée GetNumber
ne correspond pas à un index valide d'un tableau interne.try-catch
ou try-catch-finally
pour gérer l'exception levée.
L'exemple suivant gère l'exception levée par la méthode GetNumber
.throw
peut également être utilisé dans un bloc catch
pour lever de nouveau une exception gérée dans un bloc catch
.
Dans ce cas, throw
n'accepte pas d'opérande d'exception. Cela est très utile lorsqu'une méthode passe un argument d'un appelant à une autre méthode de bibliothèque,
et que la méthode de bibliothèque lève une exception qui doit être passée à l'appelant. Par exemple, l'exemple suivant lève de nouveau une exception NullReferenceException
qui
est levée lorsque vous tentez de récupérer le premier caractère d'une chaîne non initialisée.throw e
dans un bloc catch
pour instancier une nouvelle exception que vous passez à l'appelant.
Dans ce cas, la trace de la pile de l'exception d'origine, qui est disponible à partir de la propriété StackTrace
, n'est pas conservée.
throw
peut être utilisé comme expression et comme instruction.
Ainsi, une exception peut être levée dans des contextes qui n'étaient précédemment pas pris en charge.
Elles incluent notamment :throw
pour lever une exception ArgumentException
si une méthode reçoit un tableau de chaînes vide.
Avant C# 7.0, cette logique devait figurer dans une instruction if/else
.Null
: dans l'exemple suivant, une expression throw
est utilisée avec un opérateur de fusion de Null
pour lever
une exception si la chaîne assignée à une propriété Name
est null
.expression-bodied
: l'exemple suivant illustre une méthode expression-bodied
qui lève une exception InvalidCastException
,
car une conversion vers une valeur DateTime
n'est pas prise en charge.try-catch
consiste en un bloc try
suivi d'une ou plusieurs clauses catch
qui spécifient des gestionnaires pour différentes exceptions.Common Language Runtime (CLR)
recherche l'instruction catch
qui gère cette exception.
Si la méthode en cours d'exécution ne contient pas un tel bloc catch
, le CLR
examine la méthode qui a appelé la méthode actuelle, puis remonte la pile des appels.
Si aucun bloc catch
n'est trouvé, alors le CLR
affiche un message d'exception non gérée à l'utilisateur et arrête l'exécution du programme.try
contient le code protégé susceptible de provoquer l'exception.
Le bloc est exécuté jusqu'à ce qu'une exception soit levée ou qu'il se soit correctement terminé.
Par exemple, la tentative suivante d'effectuer un cast d'un objet null
déclenche l'exception NullReferenceException
:catch
puisse être utilisée sans arguments pour intercepter tout type d'exception, cette utilisation est déconseillée.
En général, vous devez intercepter uniquement les exceptions desquelles vous savez comment récupérer.
Par conséquent, vous devez toujours spécifier un argument d'objet dérivé de System.Exception
, par exemple :catch
spécifiques dans la même instruction try-catch
.
Dans ce cas, l'ordre des clauses catch
est important car les clauses catch
sont examinées dans l'ordre.
Interceptez les exceptions plus spécifiques avant les moins spécifiques.
Le compilateur produit une erreur si vous organisez vos blocs catch
de sorte qu'un bloc ultérieur ne puisse jamais être atteint.catch
constitue un moyen de filtrer les exceptions à gérer.
Vous pouvez également utiliser un filtre d'exception qui examine l'exception pour déterminer si elle doit être prise en charge.
Si le filtre d'exception retourne la valeur false
, la recherche d'un gestionnaire se poursuit.throw
peut être utilisée dans un bloc catch
pour lever une nouvelle fois l'exception interceptée par l'instruction catch
. L'exemple suivant extrait
des informations sources d'une exception IOException
, puis lève l'exception à la méthode parente.true
, comme illustré dans l'exemple suivant.InvalidCastException
à l'appelant quand e.Data
a une valeur null
.
try
, initialisez uniquement les variables qui y sont déclarées. Sinon, une exception peut se produire avant la fin de l'exécution du bloc.
Par exemple, dans l'exemple de code suivant, la variable n
est initialisée à l'intérieur du bloc try
.
Une tentative d'utilisation de cette variable en dehors du bloc try
dans l'instruction Write(n)
génère une erreur du compilateur.async
est marquée par un modificateur async
et contient généralement une ou plusieurs expressions ou instructions await
.
Une expression await
applique l'opérateur await
à un Task
ou Task‹TResult›
.await
dans la méthode async
, la progression de la méthode est interrompue jusqu'à ce que la tâche attendue se termine.
Quand la tâche est terminée, l'exécution peut reprendre dans la méthode.
await
est appliqué peut être dans un état d'erreur en raison d'une exception non gérée dans la méthode qui retourne la tâche.
L'attente de la tâche lève une exception. Une tâche peut également se terminer dans un état annulé si le processus asynchrone qui la retourne est annulé.
L'attente d'une tâche annulée lève une OperationCanceledException
.
try
, puis interceptez l'exception dans le bloc catch
associé.async
attendue.
Par exemple, la tâche peut être le résultat d'un appel à Task.WhenAll
. Quand vous attendez une telle tâche, une seule des exceptions est
interceptée et vous ne pouvez pas prévoir laquelle.try
contient un appel à la méthode ProcessString
qui risque de provoquer une exception.
La clause catch
contient le gestionnaire d'exceptions qui affiche simplement un message à l'écran. Quand l'instruction throw
est
appelée depuis MyMethod
, le système recherche l'instruction catch
et affiche le message Exception caught
.catch
sont utilisés, et l'exception la plus spécifique, qui apparaît la première, est interceptée.throw
dans ProcessString
par l'instruction suivante : throw new Exception()
.catch
le moins spécifique en premier dans l'exemple, le message d'erreur suivant s'affiche :
A previous catch clause already catches all exceptions of this or a super type ('System.Exception')
.await
dans un bloc try
et interceptez-la dans un bloc catch
.throw new Exception
dans l'exemple pour illustrer la gestion des exceptions.
La propriété IsFaulted
de la tâche a la valeur True
, la propriété Exception.InnerException
de la tâche a la
valeur de l'exception et l'exception est interceptée dans le bloc catch
.throw new OperationCanceledException
pour montrer ce qui se passe quand vous annulez un processus asynchrone.
La propriété IsCanceled
de la tâche a la valeur true
et l'exception est interceptée dans le bloc catch
.
Sous certaines conditions qui s'appliquent à cet exemple, la propriété IsFaulted
de la tâche a la valeur true
et IsCanceled
a la valeur false
.try
attend la tâche retournée par un appel à Task.WhenAll
.
La tâche est terminée quand les trois tâches auxquelles WhenAll
est appliqué sont terminées.catch
itère au sein des exceptions,
qui sont trouvent dans la propriété Exception.InnerExceptions
de la tâche retournée par Task.WhenAll
.finally
, vous pouvez nettoyer toutes les ressources allouées dans un bloc try
et vous pouvez exécuter du code même si une exception se produit dans le bloc try
.
En règle générale, les instructions d'un bloc finally
s'exécutent lorsque le contrôle quitte une instruction try
.
Le transfert de contrôle peut se produire suite à une exécution normale, à l'exécution d'une instruction break
, continue
, goto
ou return
, ou à la propagation d'une exception hors de l'instruction try
.finally
associé est assuré d'être exécuté. Toutefois, si l'exception n'est pas gérée, l'exécution du bloc finally dépend
de la manière dont l'opération de déroulement d'exception est déclenchée. Ceci, à son tour, dépend du paramétrage de votre ordinateur.finally
soit exécuté ou non n'est pas important.
Toutefois, si vous avez des instructions dans un bloc finally
qui doivent être exécutées même dans cette situation,
une solution consiste à ajouter un bloc catch
à l'instruction try-finally
.
Ou bien, vous pouvez intercepter l'exception qui peut être levée dans le bloc try
d'une instruction try-finally
plus haut dans la pile des appels. Autrement dit,
vous pouvez intercepter l'exception dans la méthode qui appelle la méthode contenant l'instruction try-finally
, ou dans la méthode qui appelle cette méthode,
ou dans n'importe quelle méthode figurant dans la pile des appels. Si l'exception n'est pas interceptée, l'exécution du bloc finally
varie selon que le système
d'exploitation choisit de déclencher une opération de déroulement d'exception.System.InvalidCastException
. L'exception n'est pas gérée.TryCast
est interceptée dans une méthode plus loin dans la pile des appels.finally
, consultez try-catch-finally
.catch
et finally
sont souvent utilisés ensemble pour obtenir et utiliser des ressources dans un bloc try
,
pour traiter des circonstances exceptionnelles dans un bloc catch
et pour libérer les ressources dans le bloc finally
.try-catch
et Génération d'exceptions.
Pour plus d'informations sur le bloc finally
, consultez try-finally
.