Csharp/C Sharp/Language Basics/Exception Try Catch

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

An exception can be generated by one method and caught by another

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

  • /

/* An exception can be generated by one

  method and caught by another. */ 

using System;

class ExcTest {

 // Generate an exception. 
 public static void genException() { 
   int[] nums = new int[4];  

   Console.WriteLine("Before exception is generated."); 
 
   // Generate an index out-of-bounds exception. 
   for(int i=0; i < 10; i++) { 
     nums[i] = i; 
     Console.WriteLine("nums[{0}]: {1}", i, nums[i]); 
   } 

   Console.WriteLine("this won"t be displayed");  
 } 

}

public class ExcDemo2 {

 public static void Main() {  
 
   try {  
     ExcTest.genException(); 
   }  
   catch (IndexOutOfRangeException) {  
     // catch the exception  
     Console.WriteLine("Index out-of-bounds!");  
   }  
   Console.WriteLine("After catch statement.");  
 }  

}


      </source>


Catch different exceptions

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

  • /

namespace nsCompare {

   using System;
   public class Compare
   {
       static public void Main (string [] args)
       {
           int TestArg;
           try
           {
               TestArg = int.Parse (args[0]);
           }
           catch (FormatException)
           {
               Console.WriteLine ("Please enter a number value.");
               return;
           }
           catch (IndexOutOfRangeException)
           {
               Console.WriteLine ("Please enter an argument");
               return;
           }
           string str;
           str = TestArg > 10 ? "The test is true" : "The test is false";
           Console.WriteLine (str);
       }
   }

}

      </source>


Catch Divide By Zero Exception

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

  • /

namespace nsDivZero {

   using System;
   public class DivZero
   {
       static public void Main ()
       {
           // Set an integer equal to 0
           int IntVal1 = 0;
           // and another not equal to zero
           int IntVal2 = 57;
           try
           {
               Console.WriteLine ("{0} / {1} = {2}", IntVal2, IntVal1, IntResult (IntVal2, IntVal1) / IntResult (IntVal2, IntVal1));
           }
           catch (DivideByZeroException e)
           {
               Console.WriteLine (e.Message);
           }
           // Set a double equal to 0
           double dVal1 = 0.0;
           double dVal2 = 57.3;
           try
           {
               Console.WriteLine ("{0} / {1} = {2}", dVal2, dVal1, DoubleResult (dVal2, dVal1));
           }
           catch (DivideByZeroException e)
           {
               Console.WriteLine (e.Message);
           }
       }
       static public int IntResult (int num, int denom)
       {
           return (num / denom);
       }
       static public double DoubleResult (double num, double denom)
       {
           return (num / denom);
       }
   }

}


      </source>


Catch Error

<source lang="csharp"> using System; public class CatchError {

   public static void Main()
   {
       int var1 = 1000, var2 = 0, var3;
       try
       {
           var3 = var1 / var2;
       }
       catch (ArithmeticException e)
       {
           Console.WriteLine("Exception: {0}", e.ToString());
           var3 = -1;
       }
       catch (Exception e)
       {
           Console.WriteLine("Exception: {0}", e.ToString());
           var3 = -2;
       }
       Console.WriteLine("The result is: {0}", var3);
   }

}


      </source>


Catches an exception that was thrown in a component

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

  • /

// FileOpen.cs -- Catches an exception that was thrown in a component // // Compile this program with the following command line: // C:>csc /r:fopen.dll FileOpen.cs // namespace nsFileOpen {

   using System;
   using System.IO;
   class clsMain
   {
       static public void Main ()
       {
           clsFile file;
           try
           {
               file = new clsFile ("");
           }
           catch (Exception e)
           {
               Console.WriteLine (e.Message);
               Console.WriteLine ("Exception handled in client");
           }
       }
   }

}

// Fopen.cs -- program to show exception handling in a component // // Compile this program with the following command line: // C:>csc /t:library Fopen.cs // namespace nsFileOpen {

   using System;
   using System.IO;
   public class clsFile
   {
       FileStream strm;
       public clsFile (string FileName)
       {
           strm = new FileStream (FileName, FileMode.Open,
                                            FileAccess.Read);
       }
   }

}


      </source>


Demonstrate exception handling

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

  • /

// Demonstrate exception handling.

using System;

public class ExcDemo1 {

 public static void Main() { 
   int[] nums = new int[4]; 

   try { 
     Console.WriteLine("Before exception is generated."); 

     // Generate an index out-of-bounds exception. 
     for(int i=0; i < 10; i++) { 
       nums[i] = i; 
       Console.WriteLine("nums[{0}]: {1}", i, nums[i]); 
     } 

     Console.WriteLine("this won"t be displayed"); 
   } 
   catch (IndexOutOfRangeException) { 
     // catch the exception 
     Console.WriteLine("Index out-of-bounds!"); 
   } 
   Console.WriteLine("After catch statement."); 
 } 

}


      </source>


Demonstrates stacking catch blocks to provide alternate code for more than one exception type

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

  • /

// Except.cs -- Demonstrates stacking catch blocks to provide alternate code for // more than one exception type. // // Compile this program with the following command line: // C:>csc Except.cs // namespace nsExcept {

   using System;
   using System.IO;
   
   public class Except
   {
       static public void Main (string [] args)
       {
           if (args.Length == 0)
           {
               Console.WriteLine ("Please enter a file name");
               return;
           }
           try
           {
               ReadFile (args[0]);
           }
           catch (ArgumentException)
           {
               Console.WriteLine ("The file name " + args [0] +
                         " is empty or contains an invalid character");
           }
           catch (FileNotFoundException)
           {
               Console.WriteLine ("The file name " + args [0] +
                                  " cannot be found");
           }
           catch (DirectoryNotFoundException)
           {
               Console.WriteLine ("The path for " + args [0] +
                                  " is invalid");
           }
           catch (Exception e)
           {
               Console.WriteLine (e);
           }
       }
       static public void ReadFile (string FileName)
       {
           FileStream strm = new FileStream (FileName, FileMode.Open,
                                                       FileAccess.Read);
           StreamReader reader = new StreamReader (strm);
           string str = reader.ReadToEnd ();
           Console.WriteLine (str);
       }
   }

}


      </source>


Demonstrates using if statements to sort out an IOException

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

  • /

// IOExcept.cs -- Demonstrates using if statements to sort out an IOException // // Compile this program with the following command line: // C:>csc IOExcept.cs // namespace nsExcept {

   using System;
   using System.IO;
   public class IOExcept
   {
       static public void Main (string [] args)
       {
           if (args.Length == 0)
           {
               Console.WriteLine ("Please enter a file name");
               return;
           }
           ReadFile (args[0]);
       }
       static public void ReadFile (string FileName)
       {
           FileStream strm = null;
           StreamReader reader = null;
           try
           {
               strm = new FileStream (FileName, FileMode.Open,
                                                  FileAccess.Read);
               reader = new StreamReader (strm);
               while (reader.Peek() > 0)
               {
                   string str = reader.ReadLine();
                   Console.WriteLine (str);
               }
           }
           catch (IOException e)
           {
               if (e is EndOfStreamException)
               {
                   Console.WriteLine ("Attempted to read beyond end of file");
               }
               else if (e is FileNotFoundException)
               {
                   Console.WriteLine ("The file name " + FileName +
                                      " cannot be found");
                   return;
               }
               else if (e is DirectoryNotFoundException)
               {
                   Console.WriteLine ("The path for name " + FileName +
                                      " cannot be found");
                   return;
               }
               else if (e is FileLoadException)
               {
                   Console.WriteLine ("Cannot read from " + FileName);
               }
               reader.Close();
               strm.Close ();
           }
           catch (Exception e)
           {
               Console.WriteLine (e.Message);
           }
       }
   }

}


      </source>


Exception Handling:Trying and Catching

<source lang="csharp"> using System; public class TryingCatching {

   static int Zero = 0;
   public static void Main()
   {
       // watch for exceptions here
       try
       {
           int j = 22 / Zero;
       }
       // exceptions that occur in try are transferred here
       catch (Exception e)
       {
           Console.WriteLine("Exception " + e.Message);
       }
       Console.WriteLine("After catch");
   }

}

      </source>


Exception Type Mismatch

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

  • /

// This won"t work!

using System;

public class ExcTypeMismatch {

 public static void Main() {  
   int[] nums = new int[4];  
 
   try {  
     Console.WriteLine("Before exception is generated."); 
 
     // Generate an index out-of-bounds exception. 
     for(int i=0; i < 10; i++) { 
       nums[i] = i; 
       Console.WriteLine("nums[{0}]: {1}", i, nums[i]); 
     } 

     Console.WriteLine("this won"t be displayed");  
   }  

   /* Can"t catch an array boundary error with a 
      DivideByZeroException. */ 
   catch (DivideByZeroException) {  
     // catch the exception  
     Console.WriteLine("Index out-of-bounds!");  
   }  
   Console.WriteLine("After catch statement.");  
 }  

}


      </source>


Handle error gracefully and continue

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

  • /

// Handle error gracefully and continue.

using System;

public class ExcDemo3 {

 public static void Main() { 
   int[] numer = { 4, 8, 16, 32, 64, 128 }; 
   int[] denom = { 2, 0, 4, 4, 0, 8 }; 

   for(int i=0; i < numer.Length; i++) { 
     try { 
       Console.WriteLine(numer[i] + " / " + 
                         denom[i] + " is " + 
                         numer[i]/denom[i]); 
     } 
     catch (DivideByZeroException) { 
       // catch the exception 
       Console.WriteLine("Can"t divide by Zero!"); 
     } 
   } 
 } 

}


      </source>


illustrates a nested try/catch block

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

  • /

/*

 Example13_5.cs illustrates a nested try/catch block;
 the nested if throws an exception that is propagated to the
 outer exception
  • /

using System; public class Example13_5 {

 public static void Main()
 {
   try
   {
     // a nested try and catch block
     try
     {
       int[] myArray = new int[2];
       Console.WriteLine("Attempting to access an invalid array element");
       myArray[2] = 1;  // throws the exception
     }
     catch (DivideByZeroException e)
     {
       // code that handles a DivideByZeroException
       Console.WriteLine("Handling a DivideByZeroException");
       Console.WriteLine("Message = " + e.Message);
       Console.WriteLine("StackTrace = " + e.StackTrace);
     }
   }
   catch (IndexOutOfRangeException e)
   {
     // code that handles an IndexOutOfRangeException
     Console.WriteLine("Handling an IndexOutOfRangeException");
     Console.WriteLine("Message = " + e.Message);
     Console.WriteLine("StackTrace = " + e.StackTrace);
   }
 }

}

      </source>


illustrates an unhandled exception

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

  • /

/*

 Example13_7.cs illustrates an unhandled exception
  • /

using System; public class Example13_7 {

 public static void Main()
 {
   int[] myArray = new int[2];
   Console.WriteLine("Attempting to access an invalid array element");
   myArray[2] = 1;
 }

}

      </source>


illustrates exception propagation with methods

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

  • /

/*

 Example13_6.cs illustrates exception propagation
 with methods
  • /

using System;

// declare the ExceptionsTest class class ExceptionsTest {

 public void AccessInvalidArrayElement()
 {
   int[] myArray = new int[2];
   try
   {
     Console.WriteLine("Attempting to access an invalid array element");
     myArray[2] = 1;
   }
   catch (IndexOutOfRangeException e)
   {
     Console.WriteLine("Handling an IndexOutOfRangeException");
     Console.WriteLine("Message = " + e.Message);
     Console.WriteLine("StackTrace = " + e.StackTrace);
   }
 }
 public void DivideByZero()
 {
   int zero = 0;
   Console.WriteLine("Attempting division by zero");
   int myInt = 1 / zero;
 }

}

public class Example13_6 {

 public static void Main()
 {
   ExceptionsTest myExceptionsTest = new ExceptionsTest();
   // call the AccessInvalidArrayElement() method,
   // this method handles the exception locally
   Console.WriteLine("Calling AccessInvalidArrayElement()");
   myExceptionsTest.AccessInvalidArrayElement();
   try
   {
     // call the DivideByZero() method,
     // this method doesn"t handle the exception locally and
     // so it must be handled here
     Console.WriteLine("Calling DivideByZero()");
     myExceptionsTest.DivideByZero();
   }
   catch (DivideByZeroException e)
   {
     Console.WriteLine("Handling an IndexOutOfRangeException");
     Console.WriteLine("Message = " + e.Message);
     Console.WriteLine("StackTrace = " + e.StackTrace);
   }
 }

}

      </source>


illustrates how to handle a specific exception

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

  • /

/*

 Example13_3.cs illustrates how to handle a specific exception
  • /

using System; public class Example13_3 {

 public static void Main()
 {
   try
   {
     int zero = 0;
     Console.WriteLine("In try block: attempting division by zero");
     int myInt = 1 / zero;  // throws the exception
   }
   catch (DivideByZeroException myException)
   {
     // code that handles a DivideByZeroException
     Console.WriteLine("Message = " + myException.Message);
     Console.WriteLine("StackTrace = " + myException.StackTrace);
   }
 }

}


      </source>


illustrates multiple catch blocks

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

  • /

/*

 Example13_4.cs illustrates multiple catch blocks
  • /

using System; public class Example13_4 {

 public static void Main()
 {
   try
   {
     int[] myArray = new int[2];
     Console.WriteLine("Attempting to access an invalid array element");
     myArray[2] = 1;
   }
   catch (DivideByZeroException e)
   {
     // code that handles a DivideByZeroException
     Console.WriteLine("Handling a System.DivideByZeroException object");
     Console.WriteLine("Message = " + e.Message);
     Console.WriteLine("StackTrace = " + e.StackTrace);
   }
   catch (IndexOutOfRangeException e)
   {
     // code that handles an IndexOutOfRangeException
     Console.WriteLine("Handling a System.IndexOutOfRangeException object");
     Console.WriteLine("Message = " + e.Message);
     Console.WriteLine("StackTrace = " + e.StackTrace);
   }
   catch (Exception e)
   {
     // code that handles a generic Exception: all other exceptions
     Console.WriteLine("Handling a System.Exception object");
     Console.WriteLine("Message = " + e.Message);
     Console.WriteLine("StackTrace = " + e.StackTrace);
   }
 }

}


      </source>


Passing Exceptions on to the Caller: Caller Confuse

<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\Passing Exceptions on to the Caller\Caller Confuse // copyright 2000 Eric Gunnerson using System; public class CallerConfuse {

   public static void Main()
   {
       Summer summer = new Summer();
       try
       {
           summer.DoAverage();
       }
       catch (Exception e)
       {
           Console.WriteLine("Exception {0}", e);
       }
   }

} public class Summer {

   int    sum = 0;
   int    count = 0;
   float    average;
   public void DoAverage()
   {
       try
       {
           average = sum / count;
       }
       catch (DivideByZeroException e)
       {
           // do some cleanup here
           throw;
       }
   }

}

      </source>


Passing Exceptions on to the Caller: Caller Inform

<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\Passing Exceptions on to the Caller\Caller Inform // copyright 2000 Eric Gunnerson using System; public class CallerInform {

   public static void Main()
   {
       Summer summer = new Summer();
       try
       {
           summer.DoAverage();
       }
       catch (Exception e)
       {
           Console.WriteLine("Exception: {0}", e);
       }
   }

} public class Summer {

   int    sum = 0;
   int    count = 0;
   float    average;
   public void DoAverage()
   {
       try
       {
           average = sum / count;
       }
       catch (DivideByZeroException e)
       {
           // wrap exception in another one,
           // adding additional context.
           throw (new DivideByZeroException(
           "Count is zero in DoAverage()", e));
       }
   }

}

      </source>


Several catch branches

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

  • /
using System;
namespace ExceptionHandling
{
   public class TesterExceptionHandling4
   {
      public void Run()
      {
          try
          {
              double a = 5;
              double b = 0;
              Console.WriteLine("Dividing {0} by {1}...",a,b);
              Console.WriteLine ("{0} / {1} = {2}",
                  a, b, DoDivide(a,b));
          }
              // most derived exception type first
          catch (System.DivideByZeroException)
          {
              Console.WriteLine(
                  "DivideByZeroException caught!");
          }
          catch (System.ArithmeticException)
          {
              Console.WriteLine(
                  "ArithmeticException caught!");
          }
              // generic exception type last
          catch
          {
              Console.WriteLine(
                  "Unknown exception caught");
          }
      }
       // 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...");
           TesterExceptionHandling4 t = new TesterExceptionHandling4();
           t.Run();
           Console.WriteLine("Exit Main...");
       }
   }
}
          
      </source>


Throw a format exception purposely to demonstrate catching a FormatException

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

  • /

// // FormExce.cs -- This program will throw a format exception purposeely // to demonstrate catching a FormatException. // // Compile this program with the following command line: // C:>csc FormExcep.cs // namespace nsExceptions {

   using System;
   public class FormExce
   {
       static public void Main ()
       {
           const double pi = 3.14159;
           try
           {
               Console.WriteLine ("pi = {0,0:f5", pi);
           }
           catch (FormatException e)
           {
               Console.WriteLine (e.Message);
           }
       }
   }

}


      </source>


Use a nested try block

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

  • /

// Use a nested try block.

using System;

public class NestTrys {

 public static void Main() { 
   // Here, numer is longer than denom. 
   int[] numer = { 4, 8, 16, 32, 64, 128, 256, 512 }; 
   int[] denom = { 2, 0, 4, 4, 0, 8 }; 

   try { // outer try 
     for(int i=0; i < numer.Length; i++) { 
       try { // nested try 
         Console.WriteLine(numer[i] + " / " + 
                            denom[i] + " is " + 
                            numer[i]/denom[i]); 
       } 
       catch (DivideByZeroException) { 
         // catch the exception 
         Console.WriteLine("Can"t divide by Zero!"); 
       } 
     } 
   }  
   catch (IndexOutOfRangeException) { 
     // catch the exception 
     Console.WriteLine("No matching element found."); 
     Console.WriteLine("Fatal error -- program terminated."); 
   } 
 } 

}


      </source>


Use multiple catch statements

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

  • /

// Use multiple catch statements.

using System;

public class ExcDemo4 {

 public static void Main() { 
   // Here, numer is longer than denom. 
   int[] numer = { 4, 8, 16, 32, 64, 128, 256, 512 }; 
   int[] denom = { 2, 0, 4, 4, 0, 8 }; 

   for(int i=0; i < numer.Length; i++) { 
     try { 
       Console.WriteLine(numer[i] + " / " + 
                          denom[i] + " is " + 
                          numer[i]/denom[i]); 
     } 
     catch (DivideByZeroException) { 
       // catch the exception 
       Console.WriteLine("Can"t divide by Zero!"); 
     } 
     catch (IndexOutOfRangeException) { 
       // catch the exception 
       Console.WriteLine("No matching element found."); 
     } 
   } 
 } 

}


      </source>


Use the "catch all" catch statement

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

  • /

// Use the "catch all" catch statement.

using System;

public class ExcDemo5 {

 public static void Main() { 
   // Here, numer is longer than denom. 
   int[] numer = { 4, 8, 16, 32, 64, 128, 256, 512 }; 
   int[] denom = { 2, 0, 4, 4, 0, 8 }; 

   for(int i=0; i < numer.Length; i++) { 
     try { 
       Console.WriteLine(numer[i] + " / " + 
                          denom[i] + " is " + 
                          numer[i]/denom[i]); 
     } 
     catch { 
       Console.WriteLine("Some exception occurred."); 
     } 
   } 
 } 

}


      </source>