异常处理

    异常提供了一种将控制权从程序的一个部分转移到另一个部分的方式。C# 异常处理有四个关键词:trycatchfinallythrow

    • try:try 块标识代码块的哪些特定的异常将被激活。它的后面是一个或多个 catch 块。
    • catch:一个用于捕获异常的程序段,将 catch 放在你希望能处理这个异常的地方。“catch”这个关键字标志着异常的捕获。
    • finally:finally 保证了无论是否有异常抛出,此代码段中的程序都会被执行。例如,如果你打开了一个文件,那么不管是否发生了异常,文件都需要关闭。
    • throw:当出现问题时,程序会抛出异常。这项工作是通过使用 throw 来实现的。

    假设一个代码块产生了一个异常,通过使用 try 和 catch 的组合可以捕获这个异常。一个 try/catch 代码块需要放置在可能会产生异常的代码段周围。try/catch 代码段就像是保护代码,它的使用语法如下:

    当你的 try 语句块可能会抛出多种异常时,你可以列出多种的 catch 语句,以便捕获不同种类的异常。

    System.ApplicationException 类支持由应用程序生成的异常。因此,由程序员定义的异常应该源于这个类。

    System.SystemException 类是所有预定义的系统异常的基类。

    下表提供了一些从 Sytem.SystemException 类派生的预定义的异常类:

    这些异常处理代码段是通过使用 try,catch,finally 关键字实现的。下面是一个除数为零的异常处理情况:

    1. using System;
    2. namespace ErrorHandlingApplication
    3. {
    4. class DivNumbers
    5. {
    6. int result;
    7. DivNumbers()
    8. {
    9. result = 0;
    10. }
    11. public void division(int num1, int num2)
    12. {
    13. try
    14. {
    15. result = num1 / num2;
    16. }
    17. catch (DivideByZeroException e)
    18. {
    19. Console.WriteLine("Exception caught: {0}", e);
    20. finally
    21. {
    22. .WriteLine("Result: {0}", result);
    23. }
    24. }
    25. static void Main(string[] args)
    26. DivNumbers d = new DivNumbers();
    27. d.division(25, 0);
    28. Console.ReadKey();
    29. }
    30. }
    31. }

    编译执行上述代码,得到如下结果:

    你也可以定义你自己的异常。自定义异常类继承自 ApplicationException 类。示范如下:

    1. using System;
    2. namespace UserDefinedException
    3. {
    4. class TestTemperature
    5. {
    6. static void Main(string[] args)
    7. {
    8. Temperature temp = new Temperature();
    9. try
    10. {
    11. temp.showTemp();
    12. }
    13. catch(TempIsZeroException e)
    14. {
    15. Console.WriteLine("TempIsZeroException: {0}", e.Message);
    16. }
    17. }
    18. }
    19. }
    20. public class TempIsZeroException: ApplicationException
    21. {
    22. public TempIsZeroException(string message): base(message)
    23. {
    24. }
    25. }
    26. public class Temperature
    27. {
    28. int temperature = 0;
    29. public void showTemp()
    30. {
    31. if(temperature == 0)
    32. {
    33. throw (new TempIsZeroException("Zero Temperature found"));
    34. }
    35. else
    36. {
    37. Console.WriteLine("Temperature: {0}", temperature);
    38. }
    39. }
    40. }

    如果某个对象是直接或间接地继承自 System.Exception 类,你可以抛出这个对象。你可以在 catch 语句块中用 throw 语句抛出这个对象:

    1. Catch(Exception e)
    2. {
    3. ...