C#2010  基于类型的筛选异常
在C#中发生异常时,异常沿对战向上传递,每个catch语句块都有机会处理该异常。catch语句的顺序十分重要,在编写异常处理的代码时,应将针对特定异常的catch语句块放在常规异常catch语句块之前,否则编译器可能会发生错误。
确定正确catch语句块的方法是将异常的类型与catch语句块中指定的异常名称进行匹配。如没有特定的catch语句块,则由可能存在的常规catch语句块捕捉异常。
要想捕获某一个被抛出的异常,只有该异常的类型与某个catch语句中指定的异常类型相匹配时,才会执行这个catch语句。基于类型筛选的异常处理程序指定仅捕捉特定类型的异常,从而可以使开发者更加详细地获得指定异常的信息。
在下面的代码中,就将示范一个使用try…catch语句块捕捉InvalidCastException异常,代码如下所示。
public class goods
{
    float gPrice;
    public float GPrice
    {
        get
        {
            return (gPrice);
        }
        set
        {
            gPrice = value;
        }
    }
}
在上面的代码中,创建了一个名为goods的类,其带有一个字段gPrice和一个属性GPrice,表示商品的价格,其可供之后的promoteGoods()方法取得对象并促销价格时使用,代码如下。
public class gx
{
    public static void promoteGoods(Object goo)
    {
        goods g = (goods)goo;
        g.GPrice = g.GPrice * 0.9f;
    }
    public static void Main(string[] args)
    {
        try
        {
            Object o = new goods();
            DateTime newyears = new DateTime(2011 , 9 , 5);
            promoteGoods(o);
            promoteGoods(newyears);
        }
        catch (InvalidCastException e)
        {
编译器错误            Console.WriteLine("向promoteGoods()方法传值时错误:" + e);
        }
    }
}
在上面的代码中,先创建了goods对象o,然后以o为参数调用promoteGoods()方法。由于这里将float型数据传递给promoteGoods()方法时将抛出InvalidCastException异常,然后又将一日期型对象newyears传递给promoteGoods()方法,在不能强制将DataTime类型转换为goods类型,因此会抛出异常,如图6-2所示。
图6-2  抛出异常结果