zoukankan      html  css  js  c++  java
  • 异常处理

    异常就是程序运行中发生的错误,程序如果发生异常,就可以进行异常处理。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

  • 相关阅读:
    我的浏览器收藏夹分类
    我的浏览器收藏夹分类
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
  • 原文地址:https://www.cnblogs.com/yk1992/p/3587644.html
Copyright © 2011-2022 走看看