在 catch 块中抛出异常

Throwing an exception in catch block

我不明白如何处理 returns 值的方法中的异常,在我的例子中是 Person[] 类型的值。我试着按照这里写的去做 - Creating and Throwing Exceptions,但我仍然遇到异常 - throw icex;线。有人可以给我提示吗? 我也尝试在 catch 块中 return null,而不是抛出,但我只得到另一个异常。(我故意使用 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  
        }    
    }        

如果您只想让方法的调用者处理异常,则可以完全删除 try/catch 块。未捕获异常时将自动 "bubble up"。

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

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

这样,异常中的堆栈跟踪就不会像您当前代码中那样 "reset"。

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

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

异常仍然会 "occur" 在 catch 块中,但它的描述会在代码中为该位置提供有用的信息。

当然最后你必须实际处理异常。如果不能对 personList 进行排序,你想做什么? Return 他们按原来的顺序?退出应用程序?告诉最终用户操作失败?