Page d'Accueil

Introduction à la manipulation de l'exception

 

Vue d'ensemble

Pendant l'exécution d'un programme, l'ordinateur fera face à deux types de situations : ceux dont il est préparé à traiter et ceux dont il ne peut pas traiter. Imaginer que vous écrivez un programme qui sollicite un nombre de l'utilisateur :

using System;

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

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

        Console.WriteLine("\nSquare Characteristics");
        Console.WriteLine("Side:      {0}", side);
        Console.WriteLine("Perimeter: {0}", side * 4);
        return 0;
    }
}

C'est un programme facile et classique. Quand il tourne, l'utilisateur est invité à dactylographier simplement un nombre. Le nombre serait alors multiplié par 4 et afficher le résultat. Imaginez qu'un utilisateur dactylographie quelque chose qui n'est pas un nombre valide, tel que le nom d'un pays ou le numéro de téléphone de quelqu'un. Puisque ce programme prévoyait un nombre et n'est pas préparé pour multiplier une chaîne de caractères à un nombre, il ne saurait pas quoi faire. La seule alternative que le compilateur aurait est d'envoyer le problème au logiciel d'exploitation, espérant que le OS saurait quoi faire. Ce qui se produit réellement est que, toutes les fois que le compilateur reçoit une tâche, il essaye de l'effectuer. S'il ne peut exécuter la tâche, n'importe quelle raison dont elle n'est pas préparée pour, elle produirait une erreur. Comme programmeur, si vous pouvez prévoir le type d'erreur qui pourrait se produire dans votre programme, vous pouvez identifier l'erreur vous-même et la traiter en disant au compilateur quoi faire quand ce type d'erreur se produit.

 

Étude pratiqueÉtude pratique : Présentation de la manipulation d'une exception

  1. Commencez Microsoft Visual C# et créez une application de console appelée GeorgetownCleaningServices4
  2. Pour créer une nouvelle classe, dans Explorateur de solution, droit-cliquez GeorgetownCleaningServices2 - > Ajouter - > classe…
  3. Placez le nom CleaningOrderInfo et cliquez OK 
  4. Changez le fichier comme suit :
     
    using System;
    
    namespace GeorgetownCleaningServices5
    {
        public class CleaningOrderInfo
        {
            // Basic information about an order
            public string CustomerName;
            public string HomePhone;
            public DateTime OrderDate;
            public DateTime OrderTime;
            // Unsigned numbers to represent cleaning items
            public uint NumberOfShirts;
            public uint NumberOfPants;
            public uint NumberOfDresses;
        }
    }
  5. Pour créer une nouvelle classe, sur le menu principal, cliquez projet  - > Ajouter la classe…
  6. Placez le nom OrderProcessing et appuyez Enter
  7. Changez le fichier comme suit :
     
    using System;
    
    namespace GeorgetownCleaningServices5
    {
        public class sealed 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();
                Console.Write("Enter the order date(mm/dd/yyyy):  ");
                cleaningOrder.OrderDate = DateTime.Parse(Console.ReadLine());
                Console.Write("Enter the order time(hh:mm AM/PM): ");
                cleaningOrder.OrderTime = DateTime.Parse(Console.ReadLine());
    
                // Request the quantity of each category of items
                Console.Write("Number of Shirts:  ");
                cleaningOrder.NumberOfShirts = uint.Parse(Console.ReadLine());
    
                Console.Write("Number of Pants:   ");
                cleaningOrder.NumberOfPants = uint.Parse(Console.ReadLine());
    
                Console.Write("Number of Dresses: ");
                cleaningOrder.NumberOfDresses = uint.Parse(Console.ReadLine());
    
                // 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
                Console.Write("Amount Tended? ");
                AmountTended = decimal.Parse(Console.ReadLine());
    
                // 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
        }
    }
  8. Accédez au fichier program.cs et changez le comme suit :
     
    using System;
    
    namespace GeorgetownCleaningServices5
    {
        class Program
        {
            static int Main()
            {
                OrderProcessing Order = new OrderProcessing();
    
                Order.ProcessOrder();
                return 0;
            }
        }
    }
  9. Exécutez l'application et l'examiner. Voici un exemple :
     
    -/- Georgetown Cleaning Services -/-
    Enter Customer Name:  Peter Moonstruck
    Enter Customer Phone: (301) 728-8830
    Enter the order date(mm/dd/yyyy):  04/22/2006
    Enter the order time(hh:mm AM/PM): 08:46
    Number of Shirts:  5
    Number of Pants:   2
    Number of Dresses: 3
    
    The Total order is: $25.70
    Amount Tended? 30
    
    ====================================
    -/- Georgetown Cleaning Services -/-
    ====================================
    Customer:    Peter Moonstruck
    Home Phone:  (301) 728-8830
    Order Date:  Saturday, April 22, 2006
    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      3   4.55       13.65
    ------------------------------------
    Total Order:   $24.30
    Tax Rate:      5.75 %
    Tax Amount:     $1.40
    Net Price:     $25.70
    ------------------------------------
    Amount Tended: $30.00
    Difference:     $4.30
    ====================================
    Press any key to continue . . .
  10. Fermer la fenêtre de DOS

Comportements exceptionnels

Une exception est une situation peu commune qui pourrait se produire dans votre programme. Comme programmeur, vous devriez prévoir n'importe quel comportement anormal qui pourrait être provoqué par l'utilisateur écrivant une l'information fausse qui pourrait autrement mener à des résultats imprévisibles. La capacité de traiter un éventuel comportement anormal d'un programme s'appelle la manipulation d'exception. C# fournit trois mots-clés pour manipuler une exception.

  1. Trying the normal flow : Pour traiter un comportement prévu d'un programme, utilisez le mot-clé try comme dans la syntaxe suivante :

    try {comportement}

    Le mot-clé try est exigé. Il fait savoir au compilateur que vous essayez un déroulement normal du programme. Le comportement réel qui doit être évalué est inclus entre une les accolades gauche « {« et droit « } ». À l'intérieur de des accolades, mettez en application le déroulement normal que le programme doit suivre, du moins pour cette section du code. Voici un exemple :
     
    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);
            }
    
            return 0;
        }
    }
  2. Erreurs contagieuses : Pendant le déroulement du programme comme élément de la section try, si un comportement anormal se produit, au lieu de laisser le compilateur envoyer une erreur au logiciel d'exploitation, vous pouvez transférer le déroulement du programme à une autre section qui peut le traiter. La syntaxe utilisée par cette section est :

    catch {Quoi Faire}

    Cette section suit toujours la section try. Il ne doit y avoir aucun code entre la parenthèse de fermeture de try et la section de catch. Le mot-clé de catch est exigé et suit la section try. Combiné avec le bloc try, la syntaxe d'une exception serait :
     
    try
    {
        // Try the program flow
    }
    catch
    {
        // Catch the exception
    }

    Un programme qui inclut une section catch apparaîtrait comme suit :
     
    using System;
    
    public class Exercise
    {
        static int Main()
        {
    	double Number;
    
    	try 
    	{
    	    Console.Write("Type a number: ");
    	    Number = double.Parse(Console.ReadLine());
    
    	    Console.WriteLine("\n{0} * 2 = {1}", Number, Number * 2);
    	}
    	catch
    	{
    	}
    
            return 0;
        }
    }

 

Étude pratiqueÉtude pratique : Présentation des exceptions vagues

  1. Pour présenter des exceptions, accédez au fichier d'OrderProcessing.cs et changez le comme suit :
     
    using System;
    
    namespace GeorgetownCleaningServices5
    {
        class OrderProcessing
        {
    	. . . No Change
    
    	public void ProcessOrder() 
    	{
    		. . . No Change
    
    	    // Request the quantity of each category of items
    	    try 
    	    {
    		Console.Write("Number of Shirts:  ");
    		Order.NumberOfShirts = uint.Parse(Console.ReadLine());
    	    }
    	    catch
    	    {
    	    }
    			
    	    try 
    	    {
    		Console.Write("Number of Pants:   ");
    		Order.NumberOfPants = uint.Parse(Console.ReadLine());
    	    }
    	    catch
    	    {
    	    }
    			
    	    try 
    	    {
    		Console.Write("Number of Dresses: ");
    		Order.NumberOfDresses = uint.Parse(Console.ReadLine());
    	    }
    	    catch
    	    {
    	    }
    			
    	    . . . No Change
    
    	    // and request money for the order
    	    try 
    	    {
    		Console.Write("Amount Tended? ");
    		AmountTended    = decimal.Parse(Console.ReadLine());
    	    }
    	    catch
    	    {
    	    }
    
    	    // Calculate the difference owed to the customer
    	    // or that the customer still owes to the store
    	    Difference      = AmountTended - SalesTotal;
    
    	    ShowReceipt();
    	}
    
    	private void ShowReceipt()
    	{
    		. . . No Change
    	}
        }
    }
  2. Exécutez l'application pour l'examiner
  3. Fermez la fenêtre DOS

Exceptions et message personnalisé

Comme mentionné déjà, si une erreur se produit en traitant le programme dans la section try, le compilateur transfère le traitement à la prochaine section catch. Vous pouvez alors utiliser la section catch pour traiter l'erreur. Au minimum, vous pouvez afficher un message pour informer l'utilisateur. Voici un exemple :

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
        {
            Console.WriteLine("There was a problem with the program");
        }

        return 0;
    }
}

Voici une erreur d'exécution du programme :

Square Processing
Enter Side: w4
There was a problem with the program
Press any key to continue . . .

Naturellement, ce type de message n'est pas particulièrement clair mais cette fois, le programme ne se crashera pas. Dans les prochaines sections, nous apprendrons de meilleures manières de traiter les erreurs et les messages.

 

Étude pratiqueÉtude pratique : Afficher les messages faits sur commande

  1. Pour afficher les messages faits sur commande à l'utilisateur, changez le fichier d'OrderProcessing.cs comme suit :
     
    using System;
    
    namespace GeorgetownCleaningServices5
    {
        class OrderProcessing
        {
    		. . . No Change
    
    	public void ProcessOrder() 
    	{
    		. . . No Change
    
    	    // Request the quantity of each category of items
    	    try 
    	    {
    		Console.Write("Number of Shirts:  ");
    		Order.NumberOfShirts = uint.Parse(Console.ReadLine());
    	    }
    	    catch
    	    {
    		Console.WriteLine("The value you typed for the number of " +
    				  "shirts is not a valid number");
    	    }
    			
    	    try 
    	    {
    		Console.Write("Number of Pants:   ");
    		Order.NumberOfPants = uint.Parse(Console.ReadLine());
    	    }
    	    catch
    	    {
    		Console.WriteLine("The value you typed for the number of " +
    		  	          "pair or pants is not a valid number");
    	    }
    			
    	    try 
    	    {
    		Console.Write("Number of Dresses: ");
    		Order.NumberOfDresses = uint.Parse(Console.ReadLine());
    	    }
    	    catch
    	    {
    		Console.WriteLine("The value you typed for the number of " +
    			          "dresses is not a valid number");
    	    }
    			
    	    . . . No Change
    
    	    try 
    	    {
    		Console.Write("Amount Tended? ");
    		AmountTended    = decimal.Parse(Console.ReadLine());
    	    }
    	    catch
    	    {
    		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()
    	{
    		. . . No Change
    	}
        }
    }
  2. Exécutez l'application pour l'examiner. Voici un exemple :
     
    -/- Georgetown Cleaning Services -/-
    Enter Customer Name:  Alexandria
    Enter Customer Phone: (102) 797-8382
    Enter the order date(mm/dd/yyyy):  04/02/2001
    Enter the order time(hh:mm AM/PM): 09:22 AM
    Number of Shirts:  6
    Number of Pants:   W
    The value you typed for the number of pair or pants is not a valid number
    Number of Dresses: 5
    
    The Total order is: $30.09
    Amount Tended? _100D
    You were asked to enter an amount of money but...
    
    ====================================
    -/- Georgetown Cleaning Services -/-
    ====================================
    Customer:    Alexandria
    Home Phone:  (102) 797-8382
    Order Date:  Monday, April 02, 2001
    Order Time:  9:22 AM
    ------------------------------------
    Item Type  Qty Unit/Price Sub-Total
    ------------------------------------
    Shirts       6   0.95        5.70
    Pants        0   2.95           0
    Dresses      5   4.55       22.75
    ------------------------------------
    Total Order:   $28.45
    Tax Rate:      5.75 %
    Tax Amount:     $1.64
    Net Price:     $30.09
    ------------------------------------
    Amount Tended:  $0.00
    Difference:    ($30.09)
    ====================================
  3. Fermez la fenêtre DOS

Page d'Accueil Copyright © 2007-2008, Yevol Suivant