我想我有点知道这个问题的答案,但总是有很多方法可以做事(其中一些显然是错误的:))...
我有一个小的递归函数来查找员工经理的 ID。这是在导入脚本中使用的,可能是直属经理已经离开(被禁用),因此我们需要找到员工(经理)经理(等等),以便我们可以为他们分配东西。如果不明显,EmployeesToDisable 是在此导入中标记为禁用的员工的通用列表。
我想我真正想问的是:在这种情况下,与捕获异常相关的开销是否需要过多的权衡。我应该以不同的方式做这件事吗? 这确实工作正常,但感觉它是一种糟糕的形式..
我有这样的代码:
private Guid getMyEnabledManagersID(OnlineEmployee e)
{
Employee manager;
try
{
//see if Employee e's manager is in the disabled list.
manager = (from emp in EmployeesToDisable where emp.EmployeeID.Equals(e.ManagerID) select emp).Single();
//yes they are, so need to call this again
return getMyEnabledManagersID(manager);
}
catch
{
return e.ManagerID;
}
}
最佳答案
撇开递归不谈,您也许应该只使用 SingleOrDefault
并测试 null。实际上,您可能不需要完整的员工对象 - 您可能只需返回 id(整个)就足够了,即
private Guid getMyEnabledManagersID(Guid managerId)
{
var disabled = (from emp in EmployeesToDisable
where emp.EmployeeID == managerId
select (Guid?)emp.ManagerID).SingleOrDefault();
return disabled == null ? managerId : getMyEnabledManagersID(disabled.Value);
}
实际上,我对原始形式的最大担心是它不特定于异常的类型;它可能是“线程中止”、“僵尸连接”、“死锁”等。
关于c# - 尝试捕捉错误的形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3802658/