如何解决C#中引发异常后的程序流
| 嗨,我正在看一些旧的C#代码,并注意到很多这样的代码:void SomeFunction()
{
if (key.Length != Dimensions)
{
throw new KeySizeException();
}
else
{
SomeOtherFunction();
}
}
我想知道是否有可能需要else块吗?我可以安全地将代码缩短到这个程度吗?
void SomeFunction()
{
if (key.Length != Dimensions)
{
throw new KeySizeException();
}
SomeOtherFunction();
}
默认情况下,异常应该使程序流脱离此方法,对吗?但是我只是想知道DotNet中是否有一种方法可以调整um处理未处理的异常的方式,这将导致第二个实现的工作方式不同于第一个实现?
解决方法
您不需要\'else \'块。这是多余的。如果您使用诸如\'Reshaper \'或\'JustCode \'之类的重构工具,通常会指出此类冗余代码元素。
,
throw
是该代码块中的显式终端,方法调用将在该点有效结束。这意味着“ 3”块是多余的,可以删除。
, 两者是完全等效的。
, 在C#中,两者的工作方式相同。我认为您在考虑是否要处理异常(而不是抛出异常),如何摆脱执行第二条语句的麻烦?
void SomeFunction()
{
if (key.Length != Dimensions)
{
throw new KeySizeException(); //Halt the execution of SomeFunction method
}
SomeOtherFunction();
}
如果您处理并且不想执行SomeOtherFunction,则可以返回以下内容。
void SomeFunction()
{
if (key.Length != Dimensions)
{
HandleMyException();
return; // Returns and halt the execution of SomeFunction method.
}
SomeOtherFunction();
}
, 正如其他人所说,这两段代码是等效的。
我以为我还有其他想法。
首先,所示代码本质上实现了包装方法(SomeFunction),该方法用作SomeOtherFunction的保护子句。我会对此保持警惕-当捕获到KeySizeException时,您将不会仅仅从堆栈跟踪中就知道SomeOtherFunction被涉及到。这也意味着,通过对该方法的简单代码检查,您无法了解SomeOtherFunction的这一要求。
此外,您可能会考虑将这些类型的代码保留为.Net 4.0代码合同-它们可以使代码阅读起来更加容易。
最后的想法-在像您这样的情况下,我有时很想离开另一个。这使其他人100%知道了预期的if / else行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。