在C#中引发异常后的程序流

本文关键字:程序 异常 | 更新日期: 2023-09-27 17:59:23

嗨,我在看一些旧的c#代码,注意到有很多这样的代码:

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

我想知道是否有必要使用其他块的情况?我可以安全地将代码缩短为这样而不会产生任何影响吗?

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

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

在C#中引发异常后的程序流

您不需要'else'块。它是多余的。如果您使用像"重塑者"或"JustCode"这样的重构工具,通常会指出这些冗余的代码元素。

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

两者完全等价。

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

不过我想我还有其他想法。

首先,如图所示的代码本质上实现了一个包装器方法(SomeFunction),该方法用作SomeOtherFunction的保护子句。我会小心这样做——当你的KeySizeException被捕获时,你根本不会从堆栈跟踪中知道SomeOtherFunction参与其中。这也意味着,通过对SometerFunction的简单代码检查,您无法看到该方法的此需求。

此外,您可能会考虑将这些类型的代码重新构造为.Net 4.0代码契约——它们可以使代码更易于阅读。

最后想一想——在像你这样的情况下,我有时会忍不住离开其他人。这让其他人100%清楚地知道if/else行为是有意的。

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