Maison  >  Article  >  développement back-end  >  Amélioration des exceptions C#

Amélioration des exceptions C#

PHPz
PHPzoriginal
2017-03-12 15:45:501264parcourir

0. Catalogue

C#6 Nouveau répertoire de fonctionnalités

1 Dans les blocs catch et finally Utilisation. wait

introduit une paire de mots-clés wait/async en C#5 pour prendre en charge le nouveau modèle de programmation asynchrone , rendant la programmation asynchrone C# Le modèle est encore simplifié (APM ->EAP->TAP->await/async. Le modèle de programmation asynchrone en C# n'est pas l'introduction de cet article. Pour des informations détaillées, veuillez vous rendre ici AsynchrModèle de programmation coûteux). Bien que wait/async ait été introduit en C#5, il comporte certaines restrictions. Par exemple, il ne peut pas être utilisé dans les blocs d'instructions catch et finy. Cette restriction ne s'appliquera plus en C#6.


Les résultats en cours d'exécution sont les suivants :
 1 using System; 2 using System.Threading; 3 using System.Threading.Tasks; 4  5 namespace csharp6 6 { 7     internal class Program 8     { 9         private static void Main(string[] args)10         {11             do12             {13                 Log(ConsoleColor.White, "caller method begin", true);14                 CallerMethod();15                 Log(ConsoleColor.White, "caller method end");16             } while (Console.ReadKey().Key != ConsoleKey.Q);17         }18 19         public static async void CallerMethod()20         {21             try22             {23                 Log(ConsoleColor.Yellow, "try ", true);24                 throw new Exception();25             }26             catch (Exception)27             {28                 Log(ConsoleColor.Red, "catch await begin", true);29                 await AsyncMethod();30                 Log(ConsoleColor.Red, "catch await end");31             }32             finally33             {34                 Log(ConsoleColor.Blue, "finally await begin", true);35                 await AsyncMethod();36                 Log(ConsoleColor.Blue, "finally await end");37             }38         }39 40         private static Task AsyncMethod()41         {42             return Task.Factory.StartNew(() =>43             {44                 Log(ConsoleColor.Green, "async method begin");45                 Thread.Sleep(1000);46                 Log(ConsoleColor.Green, "async method end");47             });48         }49 50         private static void Log(ConsoleColor color, string message, bool newLine = false)51         {52             if (newLine)53             {54                 Console.WriteLine();55             }56             Console.ForegroundColor = color;57             Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");58         }59     }60 }

Si vous faites attention, vous constaterez que

méthode asynchrone début : 6

La couleur de cette ligne n'est pas le vert que j'ai défini, mais le blanc, et l'ordre est également dans le désordre si vous l'exécutez à nouveau, il se peut qu'il soit vert ; Ceci est en fait dû au fait que les deux lignes de code de ma méthode Log (méthode non thread sécurisée ) sont appelées par plusieurs threads :


Nous pouvons apporter quelques petites modifications pour rendre la méthode Log thread-safe (il existe de nombreuses façons de le faire en C#, celle-ci n'en est qu'une) :
1 Console.ForegroundColor = color;2 Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");


Cela semble un peu hors sujet, revenons au sujet, le support du mot-clé wait dans les blocs d'instructions catch et enfin ne nécessite pas le support de l'instruction IL, ni le support du CLR, mais c'est juste la conversion de code effectuée par le compilateur (attendre /async est comme lambda pour déléguer). Je ne m'étendrai pas sur l'IL spécifique, c'est trop énorme. Voici une image pour voir la situation générale :
 1 [MethodImpl(MethodImplOptions.Synchronized)] 2 private static void Log(ConsoleColor color, string message, bool newLine = false) 3 { 4     if (newLine) 5     { 6         Console.WriteLine(); 7     } 8     Console.ForegroundColor = color; 9     Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");10 }

Le code que nous avons écrit dans CallerMethod a été transféré vers Move Suivant

(Pour des informations plus détaillées, veuillez visiter le blog de l'ami du jardin "Dev_Eric" : Avancé : Utiliser IL comme une épée, pointant directement vers async/await) (y compris les instructions wait dans catch et enfin ).

2. ExceptionFiltre

En fait, cette fonctionnalité du langage est prise en charge depuis longtemps en VB et F#, et elle peut désormais également être utilisée en C#. 6.


La section when est l'endroit où le filtre d'exception prend effet. When est suivi d'une

expression
1 try { … }2 catch (Exception e) when (filter(e))3 {4     …5 }
Si le résultat de l'expression est vrai, alors. entrez le bloc d'instruction catch actuel.

3. Référence

Modèles de programmation asynchrone

C# 6.0 attend dans catch/finally

Filtres d'exception C# 6.0

http:/ //www.php.cn/

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn