2013-03-02 58 views
3

有一个库(我不能控制)包含一个函数名为内部引发类型为StupidException的异常。我正在写一个名为Outer的函数,它调用Inner。我不能提前告知StupidException将被提出,我无法以合理的方式处理。我不希望我的功能外部来电者看到一个StupidException - 我要通过从外部,而不是(由于几个原因)返回空情况与他们沟通。所以,在我看来,最合理的代码是:空捕获块

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

我读过有关空catch块是如何邪恶,因为它“吞下”异常严厉的警告。吞噬异常正是我想要做的,在这里,实际上,但空的catch块仍然不适合我。有没有更好的办法?

+0

仅仅因为你不希望你的调用者看到异常并不意味着_you_不应该看到异常并记录它。 – 2013-03-02 13:26:56

+0

但是,如果你吞下_all_异常,你的'Outer'消费者现在是否知道它传递了无效参数?现在他只会认为查询没有返回任何结果。 – CodeCaster 2013-03-02 13:27:26

+1

@CodeCaster - 没有任何参数,但我明白你的观点。我修改了这个问题。 – bubba 2013-03-02 14:04:35

回答

8

如果这将使所以它不看空你感觉更舒服,你可以从catch块返回:

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

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

+0

你是对的 - 我不应该不分青红皂白地捕捉所有的例外。我只想通过Outer的空返回来传达一种特殊的异常。我在问题中澄清了这一点。 – bubba 2013-03-02 14:14:10

+0

好吧,那么你应该只捕获'StupidException'而不是所有的异常。 – 2013-03-02 14:36:31

0

您需要列出所有预计的例外情况,您可能会从Inner中获得并仅捕获这些例外情况。这是正确的解决方案。

+0

如果我有这样的清单,那将是美好的,但我不知道。我只知道Inner引发的一种类型的异常,这就是我想要作为Outer的调用者返回空值的通信方式。 – bubba 2013-03-02 14:01:49

+0

如果只有一个例外,那么你的问题很容易。 – 2013-03-02 14:06:19

+0

好,好,我喜欢简单的问题。答案是什么?谢谢。 – bubba 2013-03-02 14:15:43