有什么异常?
异常是一个运行时间错误; 这意味着在运行时创建了异常情况,并且程序无法成功执行。由于这些异常,我们的程序会崩溃。
在编程过程中发生以下常见异常:
除以零
文件未找到
数组索引超出范围
空引用异常
无效的强制转换例外
算术异常
溢出异常
内存不足异常等
这是一个示例/程序,将产生异常
using System; class Program { static void Main() { int number1 = 0; int number2 = 0; int result = 0; Console.WriteLine("Enter Number : "); number1 = int.Parse(Console.ReadLine()); result = number1 / number2; Console.WriteLine("Result : " + result); } }
当我们编译以上程序时,它不会产生任何错误。编译结果将是这样,
------ Build started: Project: ConsoleApplication1, Configuration: Debug x86 ------ ConsoleApplication1 ->C:\Users\Arvind\Documents\Visual Studio 2010\Projects\ihelp\ ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe ========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
而且,当我们执行程序时,它会产生这样的异常(在程序中,我们试图将数字除以0)。
上面的程序生成“被零除的异常”,该程序崩溃。因为变量number1被number2除,并且输出存储在结果变量中。其中,number2的值为0,因此发生“除以零例外”。
为了处理这种异常,我们在C#中使用异常处理。
C#中的异常处理可以使用三个块来处理
try
catch
finally
异常处理块的语法,
try { // 可能发生异常的代码 } catch(Exception Type) { // 处理异常的代码 // 显示错误消息的代码 } finally { // 应该执行的代码 // 是否发生异常 }
1) try 块
在此块中,我们编写可能产生异常或运行时错误的代码。例如,在上一个程序中,存在一个异常(除以零)。
2) catch 块
当代码引发在try块中编写的异常时,将执行此块,catch块将捕获该异常,我们可以编写代码来处理该异常或根据用户喜好显示任何消息以显示该异常。
在这里,我们使用了异常类,C#中使用了以下异常类来捕获异常。
Exception
DivideByZeroException
NullReferenceException
OutOfMemoryException
InvalidCastException
ArrayTypeMismatchException
IndexOutOfRangeException
AirthmeticException
OverFlowExecption
这些类在 System 命名空间中可用。在上面的类中,Exception 类是一个超类,其他类是子类,Exception 类可以捕获 try 块抛出的任何类型的异常。
3)finally 块
在所有情况下都将执行finally块,即程序是否正在生成异常,在离开程序之前,编译器将移至finally块。该块可用于编写执行程序所必需的代码,例如关闭文件,释放内存等。
这是处理零除异常的代码(带有异常处理)。
using System; class Program { static void Main() { int number1 = 0; int number2 = 0; int result = 0; try { Console.WriteLine("Enter Number : "); number1 = int.Parse(Console.ReadLine()); result = number1 / number2; Console.WriteLine("Result : " + result); } catch (DivideByZeroException e) { Console.WriteLine(e.Message); } finally { Console.WriteLine("程序正常退出"); } } }
输出结果