异常处理

异常就是程序运行中发生的错误,程序如果发生异常,就可以进行异常处理。C#为处理在程序执行期间可能出现的反常情况提供了内置支持。这些异常由正常控制流之外的代码处理。

1 try-catch语句

try-catch语句由一个try块后跟一个或多个catch子句构成,这些子句制定不同的异常处理程序。try块包含可能导致异常的保护代码。该块一只执行到引发异常或成功完成为止。catch子句使用时可以不带任何参数,这种情况下它不惑任何类型的异常,并被称为一般catch子句。它还可以接受从System.Exception派生的对象参数,这种情况下它处理特定的异常。在同一个try-catch语句中使用一个以上的特定catch子句。这种情况下catch子句的顺序很重要,因为会按顺序检查cathc子句,先捕获特定程度较高的异常,而不是特定成都较低的异常

在cathc块中可以使用throw语句再次引发已由catch语句捕获的异常。

class MyClass

{

  publci static void Main()

  {

    MyClass x=new MyClass();

    try

    {

      string s=null;

      x.Test(s);

    }     

    catch(Exception e) 

    {

      Console.WriteLine("{0}异常被捕获",e);

    }

  }

  public void Test(string s)

  {  

    if(s==null)

    {

      throw(new ArgumentNullException());    

    }

  }

}

2 try-finally语句

finally块用于清除try块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码。控制总是传递给finally块,与try块的退出方式无关。

catch用于处理语句块中出现的异常,而finally用于保证代码语句块的执行,与前面的try块的退出方式无关

在下面的例子中,由一个导致异常的无效转换语句。当运行语句时,受到一条运行时的错误信息,但finally子句仍继续执行并显示输出

public class MainClass

{

  static void Main()

  {

    int i=123;

    string s="Some String";

    boject o=s;

    try

    {

      //无效转换

      i=(int)o;

    }

    finally

    {

      Console.Write("i={0}",i);

    }

  }

}

上面的示例将导致引发System.InvalidCastException.

尽管捕捉了异常,但仍会执行finally块中包含的输出语句,即:

i=123;

3 try-catch-finally

catch和finally一起使用的常见方式是:在try块中捕获并使用资源,在catch块中处理异常情况,并在finally块中释放资源

static void Main(strnig[]args)

{

  try

  {

    Console.WriteLine("Enter a number");

    int i=int.Parse(Console.ReadLine());

  }  

  catch(OverflowException caught)

  {

    Console.WriteLine(caught);

  }

  finally

  {

    Console.WriteLine("Try block final.");

  }

}

运行结果如下:

Enter a number

未经处理的异常:System.FormatException:输入字符串的格式不正确。

下面做个小测试,看看最终a 的值是多少

int a=2;

try

{

  int i=int32.Parse("s);

}

catch

{

  a=1;

  return;

}

finally

{

  a=3;

}

如果你现在还在思考和计算,说明你对异常的机制还没有太明确。其实只要看finally块里面就能知道,不管前面是什么,最终a的值一定是3

 

posted on 2014-03-08 11:00  吃鱼的木头  阅读(171)  评论(0编辑  收藏  举报

导航