在 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 他们按原来的顺序?退出应用程序?告诉最终用户操作失败?
我不明白如何处理 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 他们按原来的顺序?退出应用程序?告诉最终用户操作失败?