【问题标题】:Extract Try/Catch blocks - Microsoft convention/standard [closed]提取 Try/Catch 块 - Microsoft 约定/标准 [关闭]
【发布时间】:2015-12-16 00:16:04
【问题描述】:

我正在阅读 Robert C. Martin 的《清洁代码》一书,他强烈建议“将 try 的主体和 catch 块提取到它们自己的函数中”

为了清楚起见,这是本书的示例:

public void delete(Page page)
{
    try
    {
        deletePageAndAllReferences(page);
    }
    catch (Exception e)
    {
        logError(e);
    }
}

private void deletePageAndAllReferences(Page page) throws Exception {
    deletePage(page);    
    registry.deleteReference(page.name);           
    configKeys.deleteKey(page.name.makeKey());  
}

private void logError(Exception e) {    
    logger.log(e.getMessage());  
}

这样做的原因是:

  • try/catch 块混淆了代码的结构,并将错误处理与正常处理混为一谈
  • 很好的分离,使代码更易于理解和修改。

问题是,我已经为几个项目工作了几年,这从来都不是一个规则,即使在他们真正关心干净代码的环境中,我也没有找到遵循这个规则的人。

所以我想知道: 本书示例基于 Java,我正在使用 C#/.NET,是否有任何来自 Microsoft 或来自 .NET 社区的标准或约定?

【问题讨论】:

  • 欢迎来到现实世界;有多少人连“代码完成”中强调的基本事情都做?我记得一个刚从大学毕业的程序员来到一个项目时几乎尖叫,“规格!规格!功能规格在哪里!”随着滚石乐队的歌唱和演奏,你不能总是得到你想要的。
  • 有一天有人可能会遇到deletePageAndAllReferences() 并说“谁没有在这里放任何try-catch 的愚蠢的nincompoop?让我添加一个”。然后你最终会在 try-catch 中使用 try-catch 来提高性能
  • 这是 java 还是 C# (throws Exception {)?
  • @Rob OP 说示例来自 Java 书
  • 呃,有趣的是他说这是因为一个方法应该“做一件事”。但显然提取的方法做了两件不同的事情,删除页面和所有引用。按照他自己的原则应该是两种不同的方法。

标签: java coding-style standards conventions


【解决方案1】:

我能想到的一个原因是,如果 catch 块有不止一行。例如,如果您正在记录错误、发送通知电子邮件以及回滚数据库事务或其他内容。如果您开始向 catch 块添加其他内容,您会发现自己不得不重复代码。

【讨论】:

  • 即使只有一行也值得提取。如果稍后您决定将日志记录从 logger.log(stuff) 更改为 someOtherLogger.log(stuff),您不想在十几个不同的位置替换它。
  • @DavidGreilach 大卫的好榜样。我也同意 Pierre-Luc Pineault 的观点,即使只有一行,我们也应该提取它。你认为也值得在尝试中这样做吗?我认为 Micky 说得很有道理,如果这不是整个项目中的约定,那么有人可以看到提取的函数并将 try-catch 块放入 try-catch 中-catch
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 2020-04-02
  • 2012-02-28
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 2013-08-08
  • 2011-04-09
相关资源
最近更新 更多