Layout 如何保持代码布局的可视化';吸引人的';当引入错误处理时?

Layout 如何保持代码布局的可视化';吸引人的';当引入错误处理时?,layout,error-handling,Layout,Error Handling,在编写代码时,我发现代码的外观很重要(除了它必须工作良好这一事实)。在《代码完成》(第729页)一书中有很好的描述:“对格式良好的代码的视觉和智力享受是很少有非程序员能够欣赏的乐趣。” 问题是,一旦我的代码在功能上正常工作,并且我开始引入错误处理(尝试除子句等)以使其健壮,我发现这通常会打乱我布局良好的代码,并将其转化为绝对不令人满意的东西。try-except语句和附加的if使代码的可读性和结构化程度降低 我想知道这是因为我误用或过度使用错误处理,还是不可避免? 有什么技巧可以让它好看吗?这完

在编写代码时,我发现代码的外观很重要(除了它必须工作良好这一事实)。在《代码完成》(第729页)一书中有很好的描述:“对格式良好的代码的视觉和智力享受是很少有非程序员能够欣赏的乐趣。”

问题是,一旦我的代码在功能上正常工作,并且我开始引入错误处理(尝试除子句等)以使其健壮,我发现这通常会打乱我布局良好的代码,并将其转化为绝对不令人满意的东西。try-except语句和附加的if使代码的可读性和结构化程度降低

我想知道这是因为我误用或过度使用错误处理,还是不可避免?
有什么技巧可以让它好看吗?

这完全取决于你如何编程。如果您只需进行适当的输入验证,就可以避免使用许多
try-catch
(或者您所说的
try-except
)语句。当然,要覆盖大多数垃圾用户倾向于放入表单等的内容需要做大量的工作,但这将使您的数据处理例程保持干净(或更干净)。

很难给您一个一般的答案,因为有许多不同的错误处理情况,因此有很多不同的方法来处理这个问题。如果您发布一些真实的示例,您可能会在这里得到很多关于如何改进代码的建议

一般来说,将错误处理添加到现有函数会使它们变得更大,因此将它们重构为更小的方法始终是一个好主意。如果你正在寻找一种更为通用的方法,你应该让自己适应。这是一种将所谓交叉关注点(如错误处理)的代码完全排除在业务逻辑代码之外的方法

编辑:只需一个简单的技巧:

我避免这样写错误检查:

 int MyFunction()
 {
    if( ErrorCheck1Passes())
    {
       if( ErrorCheck2Passes())
       {
           if( ErrorCheck3Passes())
           {
                callSomeFunction(...);
           }
           else
              return failureCode3;
        }
        else
           return failureCode2;
    }
    else
       return failureCode1;

    return 0;
 }
我更喜欢

int MyFunction()
{
   if( !ErrorCheck1Passes())
       return failureCode1;
   if( !ErrorCheck2Passes())
       return failureCode2;
   if( !ErrorCheck3Passes())
       return failureCode3;

   callSomeFunction(...);
   return 0;
}

我经常将需要错误处理的代码块封装到自己的函数中,这些函数将在内部处理所有可能的异常,因此在某种意义上总是成功的。调用它们的代码看起来更干净,如果这些函数被多次调用,那么代码也会变小

如果您更多地在应用程序的前端工作,从用户的角度来看,并不是每个可能的异常都需要达到其级别,那么这就更有意义了。在某些类的上下文中,有一种健壮的内部方法来处理错误并继续前进是很好的

例如,我可能有如下函数

SaveSettingsSafe();
// 'Safe' in the sense that all errors are handled internally before returning

您重新发现了Don Knuth发明的一个主要原因:错误处理掩盖主要算法太常见了。如果幸运的话,您将拥有一些语言结构,为您提供一些灵活性。例如,异常可以让您将错误处理移到其他位置,或者一级函数可以使错误处理四处移动,并减少对函数调用的if-then-else检查


如果你被困在一种没有这些特性的语言中,比如C语言,你可能想寻找一种有文化的编程工具。识字编程工具是预处理器,但它们的全部任务是帮助您提高代码的可读性。他们有一小部分狂热的追随者,你可以在网上和发表的论文中找到一些指导。

不知道识字编程,很有趣。谢谢你提到这件事。虽然我怀疑它在“现实世界”中是否真的有效。关于…安全术语的好主意。将尝试在我的代码中使用它。(让我想起了Joel关于匈牙利符号的优秀软件文章:)