代码之家  ›  专栏  ›  技术社区  ›  nat

试着抓住坏的形式?

  •  2
  • nat  · 技术社区  · 14 年前

    我想我知道这个问题的答案,但是做事总是有很多方法(有些方法显然是错误的:)。。。

    我想我真正想问的是:在这种情况下,捕获异常所带来的开销是不是太大了。我应该换一种方式来做。 这确实很管用,但感觉不太好。。

    我有这样的代码:

    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;
         }
        }
    
    4 回复  |  直到 12 年前
        1
  •  6
  •   Marc Gravell    14 年前

    SingleOrDefault 并测试空值。实际上,你 可能 不需要完整的employee对象—只需返回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);
    }
    

    事实上 我对原始表单的担心是它不是特定于 类型

        2
  •  6
  •   Eric Lippert    14 年前

    正如其他人所指出的那样 千万别那么做 你的程序有一个逻辑错误 . 通过捕获异常并继续,可以隐藏逻辑错误。

    只有当你 知道

    不使用这种最坏做法的主要原因是:

    1) 正如我所说,它隐藏了一个bug;这些异常应该 从未 从未 被扔进工作程序。这些异常是为了帮助您调试程序,而不是控制程序流。

    2) 使用异常作为这样的控制流会使调试程序变得困难。调试器通常被配置为在任何异常时停止,不管它是否被处理。许多“预期”的例外情况使这一点更加困难。不应该期待例外,应该期待例外 这就是为什么他们被称为“例外”。

        3
  •  1
  •   Akash Kava    14 年前

    除了其他答案,

    Try/Catch是非常昂贵的操作,您的简单if语句在性能方面比预期Catch和遵循逻辑更快。

    Try/Catch不应该是业务逻辑的一部分,而应该只是错误处理的一部分。

        4
  •  0
  •   kjn    14 年前

    可以使用FirstOrDefault()而不是Single并处理返回的null值。