Page d'Accueil

Revue des classes Exception de .NET

 

Introduction

.NET Framework fournit diverses classes pour manipuler presque n'importe quel type d'exception que vous pouvez imaginer.  Il y a tellement plusieurs de ces classes que nous pouvons seulement mentionner les queques unes que nous utiliserons régulièrement dans notre application.

Il y a deux manières principales d'utiliser une des classes de .NET Framework. Si vous savez avec certitude qu'une exception particulière se produira, passer son nom à la classe catch(). Vous ne devez pas appeler l'argument. Puis, dans la section catch (), affichez un message personnalisé. La deuxième option que vous avez consiste à utiliser le mot-clé throw. Nous l'étudierons plus tard.

Dorénavant, nous essayerons d'indiquer toujours le type d'exception qui pourrait être jeté (thrown) si quelque chose tourne mal dans un programme

L'exception FormatException

En étudiant le formatage des données dans la leçon 5, nous avons vu que tout ce que l'utilisateur tape dans une application à l'aide du clavier est principalement une chaîne de caractères et que vous devez convertir en type approprié avant de l'utiliser. Quand vous demandez un type spécifique de valeur à l'utilisateur, après que l'utilisateur l'ait dactylographié et que vous décidez de le convertir en type approprié, si votre conversion échoue, le programme produit une erreur. L'erreur est de la classe FormatException.

Voici un programme qui traite une exception FormatException :

using System;

class Program
{
    static int Main()
    {
        double side;

        Console.WriteLine("Square Processing");
        try
        {
            Console.Write("Enter Side: ");
            side = double.Parse(Console.ReadLine());

            Console.WriteLine("\nSquare Characteristics");
            Console.WriteLine("Side:      {0}", side);
            Console.WriteLine("Perimeter: {0}", side * 4);
        }
        catch(FormatException)
        {
            Console.WriteLine("\nYou typed an invalid number");
        }

        return 0;
    }
}

Voici un exemple d'exécution du programme :

Square Processing
Enter Side: 25.9G

You typed an invalid number
Press any key to continue . . .

Étude pratiqueÉtude pratique : Utiliser la classe FormatException

  1. Changez le fichier OrderProcessing.cs comme suit (ceci inclut la version  complète du fichier en cours ) :
     
    using System;
    
    namespace GeorgetownCleaningServices5
    {
        class OrderProcessing
        {
            #region Objects used to process an order
            // Price of items
            const decimal PriceOneShirt = 0.95M;
            const decimal PriceAPairOfPants = 2.95M;
            const decimal PriceOneDress = 4.55M;
            const decimal TaxRate = 0.0575M;  // 5.75%
    
            CleaningOrderInfo cleaningOrder;
    
            // Each of these sub totals will be used for cleaning items
            private decimal SubTotalShirts;
            private decimal SubTotalPants;
            private decimal SubTotalDresses;
    
            // Values used to process an order
            private decimal TotalOrder;
            private decimal TaxAmount;
            private decimal SalesTotal;
            private decimal AmountTended;
            private decimal Difference;
    
            #endregion
    
            #region Actions used to process and present an order
    
            public OrderProcessing()
            {
                cleaningOrder = new CleaningOrderInfo();
            }
    
            public void ProcessOrder()
            {
                Console.WriteLine("-/- Georgetown Cleaning Services -/-");
                // Request order information from the user
                Console.Write("Enter Customer Name:  ");
                cleaningOrder.CustomerName = Console.ReadLine();
                Console.Write("Enter Customer Phone: ");
                cleaningOrder.HomePhone = Console.ReadLine();
    
                try
                {
                    Console.Write("Enter the order date(mm/dd/yyyy):  ");
                    cleaningOrder.OrderDate = DateTime.Parse(Console.ReadLine());
                }
                catch (FormatException)
                {
                    Console.WriteLine("The value you entered is not a valid date");
                }
                try
                {
                    Console.Write("Enter the order time(hh:mm AM/PM): ");
                    cleaningOrder.OrderTime = DateTime.Parse(Console.ReadLine());
                }
                catch
                {
                    Console.WriteLine("The value you entered is not a valid time");
                }
    
                // Request the quantity of each category of items
                try
                {
                    Console.Write("Number of Shirts:  ");
                    cleaningOrder.NumberOfShirts = uint.Parse(Console.ReadLine());
                    if (cleaningOrder.NumberOfShirts < uint.MinValue)
                        throw new OverflowException("Negative value not " +
    						"allowed for shirts");
                }
                catch (FormatException)
                {
                    Console.WriteLine("The value you typed for the number of " +
                            "shirts is not a valid number");
                }
                try
                {
                    Console.Write("Number of Pants:   ");
                    cleaningOrder.NumberOfPants = uint.Parse(Console.ReadLine());
                }
                catch(FormatException)
                {
                    Console.WriteLine("The value you typed for the number of " +
                                 "pair or pants is not a valid number");
                }
                try
                {
                    Console.Write("Number of Dresses: ");
                    cleaningOrder.NumberOfDresses = uint.Parse(Console.ReadLine());
                }
                catch(FormatException)
                {
                    Console.WriteLine("The value you typed for the number of " +
                                 "dresses is not a valid number");
                }
                // Perform the necessary calculations
                SubTotalShirts = cleaningOrder.NumberOfShirts * PriceOneShirt;
                SubTotalPants = cleaningOrder.NumberOfPants * PriceAPairOfPants;
                SubTotalDresses = cleaningOrder.NumberOfDresses * PriceOneDress;
                // Calculate the "temporary" total of the order
                TotalOrder = SubTotalShirts + SubTotalPants + SubTotalDresses;
    
                // Calculate the tax amount using a constant rate
                TaxAmount = TotalOrder * TaxRate;
                // Add the tax amount to the total order
                SalesTotal = TotalOrder + TaxAmount;
    
                // Communicate the total to the user...
                Console.WriteLine("\nThe Total order is: {0:C}", SalesTotal);
                // and request money for the order
                try
                {
                    Console.Write("Amount Tended? ");
                    AmountTended = decimal.Parse(Console.ReadLine());
                }
                catch(FormatException)
                {
                    Console.WriteLine("You were asked to enter an " +
    				  "amount of money but...");
                }
                // Calculate the difference owed to the customer
                // or that the customer still owes to the store
                Difference = AmountTended - SalesTotal;
    
                ShowReceipt();
            }
    
            private void ShowReceipt()
            {
                Console.WriteLine();
                // Display the receipt
                Console.WriteLine("====================================");
                Console.WriteLine("-/- Georgetown Cleaning Services -/-");
                Console.WriteLine("====================================");
                Console.WriteLine("Customer:    {0}", cleaningOrder.CustomerName);
                Console.WriteLine("Home Phone:  {0}", cleaningOrder.HomePhone);
                Console.WriteLine("Order Date:  {0:D}", cleaningOrder.OrderDate);
                Console.WriteLine("Order Time:  {0:t}", cleaningOrder.OrderTime);
                Console.WriteLine("------------------------------------");
                Console.WriteLine("Item Type  Qty Unit/Price Sub-Total");
                Console.WriteLine("------------------------------------");
                Console.WriteLine("Shirts     {0,3}   {1,4}      {2,6}",
                    cleaningOrder.NumberOfShirts, PriceOneShirt, SubTotalShirts);
                Console.WriteLine("Pants      {0,3}   {1,4}      {2,6}",
                    cleaningOrder.NumberOfPants, PriceAPairOfPants, SubTotalPants);
                Console.WriteLine("Dresses    {0,3}   {1,4}      {2,6}",
                    cleaningOrder.NumberOfDresses, PriceOneDress, SubTotalDresses);
                Console.WriteLine("------------------------------------");
                Console.WriteLine(
    		"Total Order:   {0,6}", TotalOrder.ToString("C"));
                Console.WriteLine("Tax Rate:      {0,6}", TaxRate.ToString("P"));
                Console.WriteLine("Tax Amount:    {0,6}", TaxAmount.ToString("C"));
                Console.WriteLine(
    		"Net Price:     {0,6}", SalesTotal.ToString("C"));
                Console.WriteLine("------------------------------------");
                Console.WriteLine(
    		"Amount Tended: {0,6}", AmountTended.ToString("C"));
                Console.WriteLine(
    		"Difference:    {0,6}", Difference.ToString("C"));
                Console.WriteLine("====================================");
            }
            #endregion
        }
    }
  2. Exécutez l'application et l'examiner . Voici un exemple :
     
    -/- Georgetown Cleaning Services -/-
    Enter Customer Name:  Allen Dons
    Enter Customer Phone: 202-442-0400
    Enter the order date(mm/dd/yyyy):  7/14/2005
    Enter the order time(hh:mm AM/PM): 8:46 AM
    Number of Shirts:  5
    Number of Pants:   2
    Number of Dresses: 0
    
    The Total order is: $11.26
    Amount Tended? 15
    
    ====================================
    -/- Georgetown Cleaning Services -/-
    ====================================
    Customer:    Allen Dons
    Home Phone:  202-442-0400
    Order Date:  Thursday, July 14, 2005
    Order Time:  8:46 AM
    ------------------------------------
    Item Type  Qty Unit/Price Sub-Total
    ------------------------------------
    Shirts       5   0.95        4.75
    Pants        2   2.95        5.90
    Dresses      0   4.55        0.00
    ------------------------------------
    Total Order:   $10.65
    Tax Rate:      5.75 %
    Tax Amount:     $0.61
    Net Price:     $11.26
    ------------------------------------
    Amount Tended: $15.00
    Difference:     $3.74
    ====================================
    Press any key to continue . . .
  3. Fermez la fenêtre DOS

L'exception OverflowException

Une application informatique reçoit, traite, et produit des valeurs de façon régulière pendant que le programme fonctionne. Pour contrôler mieux ces valeurs, comme nous avons vu en étudiant des variables et les types de données les leçon 1 et leçon 2, le compilateur utilise des quantités appropriées d'espaces pour stocker ses valeurs. Il n'est pas peu commun que soit vous, le programmeur ou un utilisateur de votre application fournisse une valeur qui est au delà de la gamme permise basée sur le type de données. Par exemple, nous avons vu qu'un byte utilise 8 bits pour stocker une valeur et une combinaison de 8 bits peut stocker un nombre pas plus que 255. Si vous fournissez une valeur plus élevée que 255 à stocker dans un byte, vous obenez une erreur. Considérez le programme suivant :

using System;

// An Exercise class
class Exercise
{ 
    static int Main()
    {
	byte NumberOfPages;

	Console.Write("Enter the number of pages of the newspaper: ");
	NumberOfPages = byte.Parse(Console.ReadLine());

	Console.WriteLine("Number of Pages of the Newspaper: {0}\n", NumberOfPages);
    }

    return 0;
}

Quand une valeur au delà de la gamme permise est demandée à être stockée dans la mémoire, le compilateur produit (l'expression est « rejetée (thrown) » comme nous avons appris tantôt) une erreur de la classe OverflowException. Voici un exemple d'exécution du programme :

Enter the number of pages of the newspaper: 824

Unhandled Exception: System.OverflowException: Value was either too large or too
 small for an unsigned byte.
   at System.Byte.Parse(String s, NumberStyles style, IFormatProvider provider)
   at System.Byte.Parse(String s)
   at Exercise.Main() in c:\programs\msvcs .net 2003\project17\exercise.cs:line
11

Comme avec les autres erreurs, quand cette exception est rejetée, vous devriez prendre une mesure appropriée.

L'exception  ArgumentOutOfRangeException

De nouveau, en étudiant les techniques de convertion ou de formatage des valeurs dans la leçon 5, nous avons vu qu'une valeur de son type de données a été passée à la méthode Parse() pour analyse. Pour un type de données primitif, la méthode Parse () scanne la chaîne de caractères et si la chaîne ne peut pas être convertie en une valeur valide, le compilateur produit habituellement une exception FormatException comme nous avons vu plus haut. D'autres classes telles que DateTime utilisent également une méthode Parse () pour scanner la valeur qui lui est soumise. Par exemple, si vous demandez une valeur date à l'utilisateur, la méthode DateTime.Parse () scanne la chaîne pour la valider. Dans l'anglais des USA ou dans le français, Parse () s'attend à ce que l'utilisateur dactylographie une chaîne sous la forme m/d/yy ou mm/dd/yy ou mm/dd/yyyy. Considérez le programme suivant :

using System;

// An Exercise class
class Exercise
{ 
    static int Main()
    {
	DateTime DateHired;

	Console.Write("Enter Date Hired: ");
	DateHired = DateTime.Parse(Console.ReadLine());

	Console.WriteLine("Date Hired: {0:d}\n", DateHired);

	return 0;
    }
}

Si l'utilisateur dactylographie une valeur qui ne peut pas être convertie en date valide, le compilateur produit une exception ArgumentOutOfRangeException. Voici un exemple d'exécution du programme ci-dessus :

Enter Date Hired: 1244/04/258

Unhandled Exception: System.FormatException: String was not recognized as a valid DateTime.
   at System.DateTimeParse.Lex(Int32 dps, __DTString str, DateTimeToken dtok, 
DateTimeRawInfo raw, DateTimeResult result, DateTimeFormatInfo& dtfi)
   at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
   at System.DateTime.Parse(String s, IFormatProvider provider, DateTimeStyles styles)
   at System.DateTime.Parse(String s, IFormatProvider provider)
   at System.DateTime.Parse(String s)
   at Exercise.Main() in c:\programs\msvcs .net 2003\project17\exercise.cs:line 11

L'une de manières que vous pouvez user pour éviter ceci est de guider l'utilisateur mais de prendre toujours des mesures appropriées.

L'exception DivideByZeroException

La Division par zéro est une opération à éviter toujours. Elle est si importante que c'est l'une des exceptions les plus fondamentales de l'ordinateur. Il est adressé au niveau du noyau même des processeurs Intel et AMD. Il est également adressé à leur niveau par les logiciels d'exploitation. Il est également adressé par la plupart, sinon tous les compilateurs. Il est également adressé par la plupart, sinon toutes les bibliothèques. Ceci signifie que cette exception n'est n'est la bienvenue nulle part. .NET Framework fournit également sa propre classe pour faire face à cette opération.

Si une tentative de diviser une valeur par 0 est exécutée, le compilateur produit une exception DivideByZeroException.

 

Précédent Copyright © 2007-2008, Yevol Suivant