• 章节:156
  • 访问:1359
  • 时长:00:16:38
  • 日期:2016-10-09 02:33

前面我们讲了如何查找和排除错误,但是有时候,还是无法避免错误的发生,最好当然是能预料到错误的发生,编写足够健壮的代码,不至于使得程序卡死中断执行

异常

异常是在运行期间代码中产生的错误,或者代码调用的函数发生的错误。这里的“错误”比前面说的错误更模糊了,因为这里的一次可能是函数等结构中手工产生(程序员自己抛出错误)
比如下面的代码,超出了数组范围

这段代码编译时候,没问题,但是执行时候会爆异常信息

我们还可以查看异常的其他信息


大多数异常的名称都是很清晰的,异常其实也是代码类来的,也有命名空间,像上面的代码就是抛出System.IndexOutOfRangeException

这里的......Exception大多数就是异常了

使用try catch finally


这三个关键字是C#语言结构化异常处理的语法

通常结构如下:

也可以只有try和finally块没有catch,或者有一个try和多个catch块,如果是这种情况,则finally可以没有,否则是必须的

try-----------包含抛出(生产或者导致)异常的代码

catch-----------出现异常的时候要执行的代码

通常catch后面的括号,是异常的类型变量,改变量包含了异常的一些信息提示

如上面的System.IndexOutOfRangeException ex 我通过ex就可以拿到很多信息

finally---------顾名思义 就是最后的意思,也就是不管有没有捕捉到错误,有没有发生异常都会执行finally里面的代码

如果有错误出现则在catch执行后执行,多个catch的时候,会执行不同的catch

try---catch---finally 支持嵌套 比如我们在try里面调用了一个函数,函数里面使用了try catch 但是没有处理到 那么就是外面是try catch finally处理

下面看看这个例子


namespace Ch07Ex02
{
   class Program
   {
      static string[] eTypes = { "none", "simple", "index", "nested index" };

      static void Main(string[] args)
      {
         foreach (string eType in eTypes)
         {
            try
            {
               Console.WriteLine("Main() try block reached.");      // Line 23
               Console.WriteLine("ThrowException(\"{0}\") called.", eType); // Line 24
               ThrowException(eType);
               Console.WriteLine("Main() try block continues.");      // Line 26
            }
            catch (System.IndexOutOfRangeException e)                 // Line 28
            {
               Console.WriteLine("Main() System.IndexOutOfRangeException catch"
                                 + " block reached. Message:\n\"{0}\"",
                                 e.Message);
            }
            catch                                                   // Line 34
            {
               Console.WriteLine("Main() general catch block reached.");
            }
            finally
            {
               Console.WriteLine("Main() finally block reached.");
            }
            Console.WriteLine();
         }
         Console.ReadKey();
      }

      static void ThrowException(string exceptionType)
      {
         Console.WriteLine("ThrowException(\"{0}\") reached.", exceptionType); // Line 49
         switch (exceptionType)
         {
            case "none":
               Console.WriteLine("Not throwing an exception.");
               break;                                               // Line 54
            case "simple":
               Console.WriteLine("Throwing System.Exception.");
               throw (new System.Exception());                      // Line 57
            case "index":
               Console.WriteLine("Throwing System.IndexOutOfRangeException.");
               eTypes[4] = "error";                                 // Line 60
               break;
            case "nested index":
               try                                                  // Line 63
               {
                  Console.WriteLine("ThrowException(\"nested index\") " +
                                    "try block reached.");
                  Console.WriteLine("ThrowException(\"index\") called.");
                  ThrowException("index");                          // Line 68
               }
               catch                                                // Line 70
               {
                  Console.WriteLine("ThrowException(\"nested index\") general"
                                    + " catch block reached.");
                  //throw;
               }
               finally
               {
                  Console.WriteLine("ThrowException(\"nested index\") finally"
                                    + " block reached.");
               }
               break;
         }
      }
   }
}