c# - 如何重构以通过 try/multiple catch 减少嵌套深度 (NDepend)

标签 c# nested depth ndepend

在下面的代码中,NDepend 报告了一个违规,因为嵌套深度为 6(每个捕获 1 个),并且限制为 5。因此它在 this rule 中被标记。 :

Quick summary of methods to refactor

对于更一般的 IOException 只使用一个 catch 并在该 catch 中包含代码来区分 DirectoryNotFound、PathTooLong 和其他 IOException 是最好的方法吗?我不想增加嵌套深度限制,因为它对于大多数情况都是有效的限制。如果所有异常都不在同一层次结构中并且无法进行组合,那么情况又如何呢?创建属性并更改规则以禁用此方法的违规是唯一的方法吗?

private static void _TryDeleteFile(string filename)
{
    try
    {
        File.Delete(filename);
    }
    catch (ArgumentException innerEx)
    {
         // do something
    }
    catch (DirectoryNotFoundException innerEx)
    {
        // do something
    }
    catch (PathTooLongException innerEx)
    {
        // do something
    }
    catch (IOException innerEx)
    {
        // do something
    }
    catch (NotSupportedException innerEx)
    {
        // do something
    }
    catch (UnauthorizedAccessException innerEx)
    {
        // do something
    }
}

最佳答案

首先,try/catch block 在 C# 中使用起来并不那么优雅,这只是我们现在必须忍受的事情。

其次,有很多方法可以减少嵌套,但它们总是会以牺牲其他形式的复杂性为代价,因此您需要小心。请记住,NDepend 建议您减少嵌套,因为猜测您的代码可能难以阅读或维护。这可能是错误的,也可能是鉴于您可用的工具没有更好的选择。

在我看来,前进的道路实际上取决于您在每个 catch block 中所做的工作。如果它非常简单,例如仅返回字符串错误消息而没有其他内容,那么我认为您的代码按原样就可以了。但是,如果您在每个 block 中执行不同类型的逻辑,特别是如果您对不同的异常类型有重复的逻辑,那么您的代码可能会变得困惑。

重构可能是在字典、工厂类或 IOC 内核中保留“异常处理程序”(类或操作)的集合。然后,您可以在一行代码中获取异常处理程序。这将减少嵌套,但会带来其自身的复杂性。像这样的事情:

try
{
   /* Your code */
}
catch(Exception ex)
{
    var exceptionHandler = _exceptionHandlers[ex.GetType()];
    exceptionHandler.Execute(ex);
}

有许多不同的方法可以实现本质上相同的事情:您将每个逻辑 block 推送到它自己的类/方法/lambda 中,然后您就有一个中间类/方法/字典,用于获取正确的逻辑。

关于c# - 如何重构以通过 try/multiple catch 减少嵌套深度 (NDepend),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26879270/

相关文章:

c# - 使用 Windsor CaSTLe 和 WcfFacility 创建具有 Message Security 和用户名凭据的 WCF 代理

ruby-on-rails - rails accepts_nested_attributes_for :reject_if not working

c - c 中的二叉树 -> 在深度超过 7 时崩溃

xna - 通过将 2D Sprite 与 3D 模型混合来解决 Z 缓冲区问题

c# - 我们如何将事件网格的重试计数传递给azure函数?

c# - SortedSet - 存储类对象时的自定义顺序

javascript - 从另一个 JS 返回 Html 内的 Javascript 值

python - 使用字符串列表构建嵌套字典

opencv - 从立体声对获取深度图?

c# - 可移植类库中的 ConcurrentBag 替代方案