在一个方法中,我希望能够将一个值插入到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]之间有什么区别?我如何决定使用哪个?
由于
答案 0 :(得分:2)
就个人而言,我会检查是否存在,而不是允许抛出异常,更容易确定逻辑流程,并且更符合代码的意图。
请参阅这些问题和答案以进行更广泛的讨论
Is there any valid reason to ever ignore a caught exception
修改强>
再想一想,你应该考虑“包含”检查的费用。如果它可能与实际获得div一样昂贵,并且它会使例程运行所需的时间加倍,并且如果这种延迟使性能降低到可以被注意到的程度,则可能是更好的是去得到div。我仍然会捕获它并抛出ArgumentException,原始异常作为内部异常。
NB:除非您需要,否则请勿进行优化。
答案 1 :(得分:1)
还有第三种选择,但稍后我会写更多关于它的内容。
首先,捕获异常就是捕获您不期望的错误,处理它们并优雅地继续或关闭。
当您遇到不应发生或应在其他地方处理的情况时,应使用抛出异常。如果您想在方法之外处理此错误,这可能是您的解决方案。
第三种选择是实际避免您可能发生的错误。例如,您可以检查div是否存在,如果不存在则不执行任何操作,也称为防御性编程。
答案 2 :(得分:0)
不同之处在于,在这种情况下,模式将是AddToDiv会抛出异常,而ParseDocument调用AddToDiv,可以捕获并处理它。
答案 3 :(得分:0)
很好,Try / Catch更昂贵,它应该用于处理意外错误。在这种情况下,您知道您可能会收到错误而不必“尝试”
答案 4 :(得分:0)
问题是:如果ParseDocument(...)无法做你想做的事情,它是否会无声地失败?如果是这样,请在其中使用try {} catch {}。如果你需要调用代码知道ParseDocument失败了,它应该抛出一个这个调用代码可以捕获的异常。