Csharp/C Sharp/Language Basics/Exception Finally

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Demonstates the possible uses of a finally block

<source lang="csharp"> /* C# Programming Tips & Techniques by Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill (December 28, 2001) ISBN: 0072193794

  • /

// Finally.cs -- Demonstates the possible uses of a finally block // // Compile this program with the following command line: // C:>csc Finally.cs // namespace nsFinally {

   using System;
   public class Finally
   {
       static public void Main ()
       {
           try
           {
               NoProblem ();
           }

// No exception possible here. Use finally without a catch

           finally
           {
               Console.WriteLine ("No problem at all\r\n");
           }
           try
           {
               SmallProblem ();
           }
           catch (clsException e)
           {
               Console.WriteLine (e.Message);
           }
           finally
           {
               Console.WriteLine ("But not big enough to exit\r\n");
           }
           try
           {
               BigProblem ();
           }
           catch (DivideByZeroException e)
           {
               Console.WriteLine (e.Message);
           }
           finally
           {
               Console.WriteLine ("But the finally block still executes.");
           }
       }
       static public void NoProblem()
       {
       }
       static public void SmallProblem ()
       {
           clsException ex = new clsException();
           ex.Message = "Small problem encountered";
           throw (ex);
       }
       static public void BigProblem ()
       {
           clsException ex = new clsException();
           ex.Message = "Big trouble. Applicaion must end.";
           throw (ex);
       }
   }

// Define a custom exception class just for a personalized message

   public class clsException : Exception
   {
       new public string Message = null;
   }

}

      </source>


Exception handle with finally

<source lang="csharp"> /* Learning C# by Jesse Liberty Publisher: O"Reilly ISBN: 0596003765

  • /
using System;
namespace ExceptionHandling
{
   public class TesterExceptionHandling6
   {
      public void Run()
      {
          try
          {
              Console.WriteLine("Open file here");
              double a = 12;
              double b = 0;
              Console.WriteLine ("{0} / {1} = {2}",
                  a, b, DoDivide(a,b));
              Console.WriteLine (
                  "This line may or may not print");
          }
              // most derived exception type first
          catch (System.DivideByZeroException e)
          {
              Console.WriteLine(
                  "\nDivideByZeroException! Msg: {0}",
                  e.Message);
              Console.WriteLine(
                  "\nHelpLink: {0}", e.HelpLink);
              Console.WriteLine(
                  "\nHere"s a stack trace: {0}\n",
                  e.StackTrace);
          }
          catch
          {
              Console.WriteLine(
                  "Unknown exception caught");
          }
          finally
          {
              Console.WriteLine (
                  "Close file here.");
          }
      }
       // do the division if legal
       public double DoDivide(double a, double b)
       {
           if (b == 0)
           {
               DivideByZeroException e =
                   new DivideByZeroException();
               e.HelpLink =
                   "http://www.libertyassociates.ru";
               throw e;
           }
           if (a == 0)
               throw new ArithmeticException();
           return a/b;
       }
       static void Main()
       {
           Console.WriteLine("Enter Main...");
           TesterExceptionHandling6 t = new TesterExceptionHandling6();
           t.Run();
           Console.WriteLine("Exit Main...");
       }
   }
}
          
      </source>


Exception Handling Finally

<source lang="csharp"> /* A Programmer"s Introduction to C# (Second Edition) by Eric Gunnerson Publisher: Apress L.P. ISBN: 1-893115-62-3

  • /

// 04 - Exception Handling\Finally // copyright 2000 Eric Gunnerson using System; using System.IO; public class ExceptionHandlingFinally {

   public static void Main()
   {
       Processor processor = new Processor();
       try
       {
           processor.ProcessFile();
       }
       catch (Exception e)
       {
           Console.WriteLine("Exception: {0}", e);
       }
   }

} class Processor {

   int    count;
   int    sum;
   public int average;
   void CalculateAverage(int countAdd, int sumAdd)
   {
       count += countAdd;
       sum += sumAdd;
       average = sum / count;
   }    
   public void ProcessFile()
   {
       FileStream f = new FileStream("data.txt", FileMode.Open);
       try
       {
           StreamReader t = new StreamReader(f);
           string    line;
           while ((line = t.ReadLine()) != null)
           {
               int count;
               int sum;
               count = Convert.ToInt32(line);
               line = t.ReadLine();
               sum = Convert.ToInt32(line);
               CalculateAverage(count, sum);
           }
       }
       // always executed before function exit, even if an
       // exception was thrown in the try.
       finally
       {
           f.Close();
       }
   }

}

      </source>


Exception with finally

<source lang="csharp"> /* Learning C# by Jesse Liberty Publisher: O"Reilly ISBN: 0596003765

  • /
using System;
namespace ExceptionHandling
{
   public class TesterExceptionHandling5
   {
      public void Run()
      {
          try
          {
              Console.WriteLine("Open file here");
              double a = 5;
              double b = 0;
              Console.WriteLine ("{0} / {1} = {2}",
                  a, b, DoDivide(a,b));
              Console.WriteLine (
                  "This line may or may not print");
          }
              // most derived exception type first
          catch (System.DivideByZeroException)
          {
              Console.WriteLine(
                  "DivideByZeroException caught!");
          }
          catch
          {
              Console.WriteLine("Unknown exception caught");
          }
          finally
          {
              Console.WriteLine ("Close file here.");
          }
      }
       // do the division if legal
       public double DoDivide(double a, double b)
       {
           if (b == 0)
               throw new System.DivideByZeroException();
           if (a == 0)
               throw new System.ArithmeticException();
           return a/b;
       }
       static void Main()
       {
           Console.WriteLine("Enter Main...");
           TesterExceptionHandling5 t = new TesterExceptionHandling5();
           t.Run();
           Console.WriteLine("Exit Main...");
       }
   }
}
          
      </source>


illustrates a try, catch, and finally block

<source lang="csharp"> /* Mastering Visual C# .NET by Jason Price, Mike Gunderloy Publisher: Sybex; ISBN: 0782129110

  • /

/*

 Example13_1.cs illustrates a try, catch, and finally block
  • /

using System; public class Example13_1 {

 public static void Main()
 {
   try
   {
     // code that throws an exception
     int zero = 0;
     Console.WriteLine("In try block: attempting division by zero");
     int myInt = 1 / zero;  // throws the exception
     Console.WriteLine("You never see this message!");
   }
   catch
   {
     // code that handles the exception
     Console.WriteLine("In catch block: an exception was thrown");
   }
   finally
   {
     // code that does any cleaning up
     Console.WriteLine("In finally block: do any cleaning up here");
   }
 }

}


      </source>


Use finally

<source lang="csharp"> /* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852

  • /

// Use finally.

using System;

class UseFinally {

 public static void genException(int what) { 
   int t; 
   int[] nums = new int[2]; 

   Console.WriteLine("Receiving " + what); 
   try { 
     switch(what) { 
       case 0:  
         t = 10 / what; // generate div-by-zero error 
         break; 
       case 1: 
         nums[4] = 4; // generate array index error. 
         break; 
       case 2: 
         return; // return from try block 
     } 
   } 
   catch (DivideByZeroException) { 
     // catch the exception 
     Console.WriteLine("Can"t divide by Zero!"); 
     return; // return from catch 
   } 
   catch (IndexOutOfRangeException) { 
     // catch the exception 
     Console.WriteLine("No matching element found."); 
   } 
   finally { 
     Console.WriteLine("Leaving try."); 
   } 
 }   

}

public class FinallyDemo {

 public static void Main() { 
    
   for(int i=0; i < 3; i++) { 
     UseFinally.genException(i); 
     Console.WriteLine(); 
   } 
 } 

}


      </source>


Use final to deal with custom Exceptions

<source lang="csharp"> using System; using System.Runtime.Serialization; class TestDirectoryMissingException : ApplicationException {

   public TestDirectoryMissingException() :
       base() {
   }
   public TestDirectoryMissingException(string msg) :
       base(msg) {
   }
   public TestDirectoryMissingException(SerializationInfo info, StreamingContext cxt) :
       base(info, cxt) {
   }
   public TestDirectoryMissingException(string msg, Exception inner) :
       base(msg, inner) {
   }

} class MainClass {

   static void DoStuff() {
       if (System.IO.Directory.Exists("c:\\test") == false)
           throw new TestDirectoryMissingException("The test directory does not exist");
   }
   static void Main(string[] args) {
       try { 
           DoStuff();
       } catch (System.IO.DirectoryNotFoundException e1) {
           System.Console.WriteLine(e1.StackTrace);
           System.Console.WriteLine(e1.Source);
           System.Console.WriteLine(e1.TargetSite);
       } catch (System.IO.FileNotFoundException e2) {
       } catch (System.Exception e) {
           System.Console.WriteLine("Ex");
       } finally {
           System.Console.WriteLine("final");
       }
   }

}

</source>