空抓块

时间:2013-03-02 13:16:43

标签: c# try-catch

有一个库(我无法控制),其中包含一个名为 Inner 的函数,它会引发类型 StupidException 的异常。我正在编写一个名为 Outer 的函数,该函数调用 Inner 。我不能提前告诉我什么时候会出现 StupidException ,我无法以任何合理的方式处理它。我不希望我的函数外部的调用者看到 StupidException - 我将通过从 Outer <返回null来向他们传达这种情况/ strong>,而不是(由于几个原因)。所以,在我看来,最合理的代码是:

public thing Outer()
{
  thing result = null;
  try
  {
     result = Inner();
  }
  catch(StupidException ex)
  {
     // do nothing
  }
  return result;
}

我已经阅读了关于空陷阱是如何邪恶的严厉警告,因为它“吞噬”了异常。吞下异常正是我想要做的事情,实际上,这里空的捕获块对我来说仍然感觉不对。有没有更好的办法?

2 个答案:

答案 0 :(得分:8)

如果这会让你感觉更舒服,你可以从catch块返回,这样它看起来不会是空的:

public thing Outer()
{
    try
    {
        return Inner();
    }
    catch
    {
        return null;
    }
}

如果意图是吞下例外,那就没问题了。您可能只想验证此内部函数可能抛出的异常类型,以便仅捕获它们而不是捕获所有异常。例如,您可以联系此代码的作者,以询问他们的代码可能抛出的异常类型,然后仅针对这些异常。

答案 1 :(得分:0)

您需要列出所有预期的异常,您可以从内部获取并仅捕获这些异常。这是正确的解决方案。