在catch块中抛出异常

时间:2015-02-17 10:04:31

标签: c# exception-handling

我无法理解如何在返回值的方法中处理异常,在我的例子中是Person []类型的值。我试着按照这里所写的那样做 - Creating and Throwing Exceptions,但我仍然得到例外 - 扔冰淇淋;线。有人可以给我一个提示吗? 我也尝试在catch块中返回null,而不是throw,但我只得到另一个例外。(我故意使用ArrayList而不是List)

static ArrayList CreateNonGenericList()
    {            
        ArrayList personList = new ArrayList()
            {
                new Person {FirstName="John", LastName="Clark", Age=39, 
                    StartDate= new DateTime(1989, 12, 30)},
                new Person{FirstName="Zefa", LastName="Thoms", Age=23, 
                    StartDate= new DateTime(2003, 4, 12)},
                new Person{FirstName="Robin", LastName="Hood", Age=33, 
                    StartDate= new DateTime(2001, 4, 12)}
            };
        personList.Add("John"); //Passing a String value instead of Person
        return personList;
    }

    static Person[] SortNonGenericList(ArrayList personList)
    {
        try
        {
            Person[] latestpersonList = (from Person p in personList
                                         where p.StartDate > new DateTime(2000, 1, 1)
                                         select p).ToArray();
            return latestpersonList; 
        }
        catch (InvalidCastException ex)
        {
            InvalidCastException icex = new InvalidCastException(ex.Message, ex);                
            throw icex; //Getting an InvalidCastException here  
        }    
    }        

1 个答案:

答案 0 :(得分:2)

如果您只想让方法的调用者处理异常,您可以完全删除try/catch块。例外情况将会出现'#34;冒泡"当他们没有被抓住时自动。

如果您想在catch块中执行某些操作(例如日志记录),则应抛出原始异常:

catch (InvalidCastException ex)
{
    // Log(ex);
    throw;
}

这样,异常中的堆栈跟踪不会被重置"就像你现在的代码一样。

正如其他人所指出的那样,您当前正在做的事情是无用的,因为您正在抛出具有相同类型和消息的异常。例如,如果您想要更具描述性的异常,则创建新异常非常有用:

catch (InvalidCastException ex)
{
    throw new ApplicationException("Unable to Sort list because at least one person has no StartDate", ex);
}

然后,例外仍然会发生"在catch块中,但它的描述将为代码中的该位置提供有用的信息。

当然最终你必须实际处理异常。如果你不能对personList进行排序,你想做什么?按原来的顺序归还?退出申请?告诉最终用户操作失败了吗?