Книга: C# 2008 Programmer

Handling Multiple Exceptions

Handling Multiple Exceptions

To handle different types of exceptions, you can have one or more catch blocks in the try-catch statement. The following example shows how you can catch three different exceptions:

DivideByZeroException — Thrown when there is an attempt to divide an integral or decimal value by zero.

FormatException — Thrown when the format of an argument does not meet the parameter specifications of the invoked method.

Exception — Represents errors that occur during application execution.

This example handles the three different exceptions and then prints out a custom error message:

static void Main(string[] args) {
 int num1, num2, result;
 try {
 Console.Write("Please enter the first number:");
 num1 = int.Parse(Console.ReadLine());
 Console.Write("Please enter the second number:");
 num2 = int.Parse(Console.ReadLine());
 result = num1 / num2;
 Console.WriteLine("The result of {0}/{1} is {2}", num1, num2, result);
 } catch (DivideByZeroException ex) {
  Console.WriteLine("Division by zero error.");
 } catch (FormatException ex) {
  Console.WriteLine("Input error.");
 } catch (Exception ex) {
  Console.WriteLine(ex.Message);
 }
 Console.ReadLine();
}

In this program, typing in a numeric value for num1 and an alphabetic character for num2 produces the FormatException exception, which is caught and displayed like this?

Please enter the first number:6
Please enter the second number:a
Input error.

Entering 0 for the second number throws the DivideByZeroException exception, which is caught and displays a different error message:

Please enter the first number:7
Please enter the second number:0
Division by zero error.

So far, all the statements are located in the Main() function. What happens if you have a function called PerformDivision() that divides the two numbers and returns the result, like this?

class Program {
 static void Main(string[] args) {
  int num1, num2;
  try {
   Console.Write("Please enter the first number:");
   num1 = int.Parse(Console.ReadLine());
   Console.Write("Please enter the second number:");
   num2 = int.Parse(Console.ReadLine());
   Program myApp = new Program();
   Console.WriteLine("The result of {0}/{1} is {2}", num1, num2,
    myApp.PerformDivision(num1, num2));
  } catch (DivideByZeroException ex) {
   Console.WriteLine("Division by zero error.");
  } catch (FormatException ex) {
   Console.WriteLine("Input error.");
  } catch (Exception ex) {
   Console.WriteLine(ex.Message);
  }
  Console.ReadLine();
 }
 private int PerformDivision(int num1, int num2) {
  return num1 / num2;
 }
}

If num2 is zero, an exception is raised within the PerformDivision() function. You can either catch the exception in the PerformDivision() function or catch the exception in the calling function — Main() in this case. When an exception is raised within the PerformDivision() function, the system searches the function to see if there is any catch block for the exception. If none is found, the exception is passed up the call stack and handled by the calling function. If there is no try-catch block in the calling function, the exception continues to be passed up the call stack again until it is handled. If no more frames exist in the call stack, the default exception handler handles the exception and your program has a runtime error.

Оглавление книги


Генерация: 1.478. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз