在C#中抛出异常后的程序流程

时间:2011-06-18 09:54:47

标签: c# exception-handling program-flow

您好我正在查看一些旧的c#代码并注意到很多这样的代码:

void SomeFunction()
{
    if (key.Length != Dimensions)
    {
        throw new KeySizeException();
    }
    else
    {
        SomeOtherFunction();
    }
}

我想知道是否有一种情况甚至需要使用else块?我能否安全地将代码缩短到此而没有任何影响?

void SomeFunction()
{
    if (key.Length != Dimensions)
    {
        throw new KeySizeException();
    }

    SomeOtherFunction();
}

默认情况下,异常应该抛出这个方法的程序流吗?但我只是想知道DotNet中是否有办法调整未处理的异常是如何处理的,这会导致第二个实现与第一个实现不同?

5 个答案:

答案 0 :(得分:5)

您不需要'else'块。这是多余的。如果您使用“Reshaper”或“JustCode”之类的重构工具,则通常会指出这些冗余代码元素。

答案 1 :(得分:3)

throw是该代码块中的显式终端,方法调用将在该点有效结束。这意味着else块是多余的,可以删除。

答案 2 :(得分:1)

两者完全等效。

答案 3 :(得分:1)

在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(); 
} 

答案 4 :(得分:0)

正如其他人所说,这两段代码是等价的。

我觉得我还有一些额外的想法。

首先,所示的代码基本上实现了一个包装器方法(SomeFunction),它作为SomeOtherFunction的保护子句。我会警惕这样做 - 当你的KeySizeException被捕获时,你不会从堆栈跟踪中知道SomeOtherFunction完全参与其中。这也意味着您无法通过对该方法的简单代码检查来了解SomeOtherFunction的这一要求。

此外,您可以考虑将这些类型的代码重构为.Net 4.0代码合同 - 它们可以更容易地阅读代码。

最后的想法 - 在像你这样的情况下,我有时会想要离开别人。这使得其他人100%清楚if / else行为是有意的。