catch块之间的区别和方法中抛出新的Exception

时间:2008-12-12 17:22:52

标签: c# exception

在一个方法中,我希望能够将一个值插入到div中,该div是我选择解析的html文档的一部分。

public void AddToDiv(string div)
{
    //Code to read the html document and look for the div 
    //(name specified as the parameter of this method).
} 

问题是,我可以指定一个名为“abc”的div,但html文档可能没有这个div。很公平,但我说的有什么区别:

try
{
    //Method logic to parse document for the div
}
catch(ArgumentException ex)
{
    // (I wouldn't supress this catch block in production code, 
    // just omitting body details for simplicity.
}

OR

public void ParseDocument
{
    //Logic here...

    if(!document.Contains(div)
    {
    throw new ArgumentException();
    }
}

简而言之,catch块和在主逻辑块中抛出new [ExceptionType here]之间有什么区别?我如何决定使用哪个?

由于

5 个答案:

答案 0 :(得分:2)

就个人而言,我会检查是否存在,而不是允许抛出异常,更容易确定逻辑流程,并且更符合代码的意图。

请参阅这些问题和答案以进行更广泛的讨论

When to throw an exception

Is there any valid reason to ever ignore a caught exception

How slow are .net exceptions?

修改

再想一想,你应该考虑“包含”检查的费用。如果它可能与实际获得div一样昂贵,并且它会使例程运行所需的时间加倍,并且如果这种延迟使性能降低到可以被注意到的程度,则可能是更好的是去得到div。我仍然会捕获它并抛出ArgumentException,原始异常作为内部异常。

NB:除非您需要,否则请勿进行优化。

答案 1 :(得分:1)

还有第三种选择,但稍后我会写更多关于它的内容。

首先,捕获异常就是捕获您不期望的错误,处理它们并优雅地继续或关闭。

当您遇到不应发生或应在其他地方处理的情况时,应使用抛出异常。如果您想在方法之外处理此错误,这可能是您的解决方案。

第三种选择是实际避免您可能发生的错误。例如,您可以检查div是否存在,如果不存在则不执行任何操作,也称为防御性编程。

答案 2 :(得分:0)

抛出和捕获是异常处理的两个相反方面。遇到灾难但无法从中恢复的组件会抛出异常。在堆栈中较低的位置,调用组件可以捕获异常并处理它。

不同之处在于,在这种情况下,模式将是AddToDiv会抛出异常,而ParseDocument调用AddToDiv,可以捕获并处理它。

答案 3 :(得分:0)

很好,Try / Catch更昂贵,它应该用于处理意外错误。在这种情况下,您知道您可能会收到错误而不必“尝试”

答案 4 :(得分:0)

问题是:如果ParseDocument(...)无法做你想做的事情,它是否会无声地失败?如果是这样,请在其中使用try {} catch {}。如果你需要调用代码知道ParseDocument失败了,它应该抛出一个这个调用代码可以捕获的异常。