空的catch块

3

有一个库(我无法控制)包含了一个名为Inner的函数,它会抛出StupidException类型的异常。我正在编写一个名为Outer的函数调用Inner。我无法提前知道何时会引发StupidException,也无法以任何合理的方式处理它。我不希望我的函数Outer的调用者看到StupidException——为了几个原因,我将通过从Outer返回null来向他们传达这种情况。因此,对我而言,最合理的代码似乎是:

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

我已经阅读了有关空catch块的严厉警告,因为它“吞噬”异常。事实上,在这里我确实想吞噬异常,但空的catch块对我来说仍然不太合适。有更好的方法吗?


仅仅因为你不想让调用者看到异常,这并不意味着你自己不应该看到异常并记录它。 - John Saunders
但是如果你吞掉了所有的异常,那么你的“Outer”消费者怎么知道它传递了无效参数呢?现在他只会认为查询没有返回任何结果。 - CodeCaster
1
@CodeCaster -- 没有任何参数,但我理解你的观点。我已经修改了问题。 - bubba
2个回答

8
如果这样做可以让您感到更舒适,您可以从catch块返回,以便它看起来不是空的:
public thing Outer()
{
    try
    {
        return Inner();
    }
    catch
    {
        return null;
    }
}

如果意图是吞噬异常,那么这样做是可以的。您可能只想验证此内部函数可能引发的异常类型,以便仅捕获它们而不是捕获所有异常。例如,您可以联系此代码的作者以了解其代码可能引发的异常类型,然后仅针对这些异常进行捕获。


你说得对——我不应该不加区分地捕获所有的异常。我只想通过 Outer 的空返回值来传达一种特定的异常。我在问题中进行了澄清。 - bubba
好的,那么你应该只捕获 StupidException 而不是所有异常。 - Darin Dimitrov

0

如果你需要所有可能从内部抛出的异常列表,那么只需捕获这些异常即可。这是正确的解决方案。


如果我有这样的列表就太好了,但事实并非如此。我只知道Inner抛出的一种类型异常,我想将其作为空返回传达给Outer的调用方。 - bubba
如果只有一个异常,那么你的问题就很容易解决了。 - V-X

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接