C# 空挡块

C# 空挡块,c#,try-catch,C#,Try Catch,有一个库(我不控制)包含一个名为internal的函数,该函数引发类型为StupidException的异常。我正在编写一个名为外部的函数,它调用内部。我无法提前知道什么时候会出现愚蠢的异常,我也无法以任何合理的方式处理它。我不希望我的函数Outer的调用者看到愚蠢的异常——我将通过从Outer返回null来与他们交流情况(出于几个原因)。因此,在我看来,最合理的准则是: public thing Outer() { thing result = null; try { r

有一个库(我不控制)包含一个名为internal的函数,该函数引发类型为StupidException的异常。我正在编写一个名为外部的函数,它调用内部。我无法提前知道什么时候会出现愚蠢的异常,我也无法以任何合理的方式处理它。我不希望我的函数Outer的调用者看到愚蠢的异常——我将通过从Outer返回null来与他们交流情况(出于几个原因)。因此,在我看来,最合理的准则是:

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

我读过严厉的警告,说空的catch块是邪恶的,因为它“吞噬”了例外。事实上,在这里,吞下异常正是我想要做的,但是空的catch块对我来说仍然不合适。有更好的办法吗

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

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

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

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

你不想让你的调用者看到异常并不意味着你不应该看到异常并记录它。但是如果你吞下所有异常,你的
Outer
消费者现在怎么知道它传递了无效参数呢?现在他会认为查询没有返回任何结果。@CodeCaster--没有任何参数,但我明白你的意思。我已经修改了这个问题。如果我有这样一个清单会很好,但我没有。我只知道一种类型的异常是由内部抛出的,这就是我想要作为null返回传递给外部调用方的异常。如果只有一个异常,那么问题很简单。你是对的——我不应该不加区分地捕获所有异常。我只想通过一个来自外部的空返回来传递一种特殊的异常。我在问题中澄清了这一点。好的,那么您应该只捕获
StupidException
,而不是所有异常。