2009-08-05 37 views
3

是否有任何关于在大型软件中每个源代码行有多少catch语句的规则?例如,在用C#编写的软件中,Visual Studio显示了大约350行包含单词“catch”的行,并且cloc报告说我们有大约160k SLOC,30k注释行和15k空白行。每个捕获语句160k/350大约是467行代码。良好的捕获语句与代码行之间的比率

但是,由于我们使用标准的C#格式化,并在它们自己的行上使用了大括号,所以谁知道160k中有多少行只是单个括号,而160k正在计算一些文件树不再编译到应用程序等等。我可能猜测“有用”比率接近每400 LOC的1个捕获量。

至少不出乎意料,我们错过了一个半关键的异常,它被捕获到一个空的catch块中,所以现在我正在通过代码库并至少打印出调试控制台的异常作为一种临时措施,或者在抓到的例外方面变得更具体。这当然会增加我们在整个应用程序中的捕获次数,但是它会使我们更接近“可接受”区域吗?我不知道每467 LOC的1次捕获是好还是好,甚至是可怕的。


我很了解 为什么不使用空的catch块。其他/以前的维护者一直很懒。而且由于这个产品的下一个版本对时间要求很高,所以我现在没有时间进入并正确地修复所有300(?)糟糕的捕获声明并验证软件的正确运行(当然,我们几乎没有自动化测试使这更容易:/)。

我只是在寻找是否有任何一种“直觉”,以至于应该多频繁地看一次try-catches。有几个答案说这是上下文敏感的,这是我所怀疑的,但不确定的。

回答

10

很难给出一个通用数字 - 它将取决于应用程序的意图是什么以及是否需要执行可能以可恢复方式失败的操作。

重要的一点是,空的catch块是一个非常糟糕的主意。这比每个catch块的代码行更重要。

+0

空试块本身并不是一个坏主意(即它们可以正确使用)。只有主程序员滥用它们,他们应该真正记录错误并提供用户反馈。 – Noldorin 2009-08-05 16:53:15

+0

查看基于此的另一个问题,处理空try-catch块:[为什么空catch块是个坏主意?](http://stackoverflow.com/questions/1234343/why-are-empty-catch-blocks- A-坏主意)。 – Lode 2011-08-10 09:32:52

+4

不赞同Noldorin,并会建议空的catch块总是错的。如果您确实想要完全忽略某种类型的问题,请以某种方式限定捕获量,以便仅忽略您期望的错误类型。方法:catch(VerySpecificExceptionType ex){} >>或<< catch(Exception ex){if(ex.Message!=“我期望的东西”)throw; } >> 我打开反例,空的catch块可能没问题,但我很怀疑:) – pettys 2011-09-16 16:37:19

13

你不应该捕捉异常,除非你真的要处理他们。除非处理程序可以“撤消”例外情况,或者以其他方式增加价值,否则应该允许例外情况冒泡给可以处理它的人。

+2

谢谢!很多人只是在没有做任何事情的情况下捕捉异常。如果您不打算处理异常,只需在应用的顶部放置一个捕获记录异常并向用户发送消息。我讨厌通过代码在几百个地方发现异常但从未处理过的代码。 – 2009-09-01 23:48:29

6

我会完全忽略这样的指标。计算代码行不一定是有用的指标 - 特别是在查找比率时。

这里真正的答案完全取决于上下文。 catch语句的“正确”数量是处理可能发生的异常所需的try/catch块的数量,您将正确处理这些异常。你应该围绕任何可能发生的异常处理try/catch块。如果你无法正确处理它(或不想处理它),让它向上传播 - 不要抓住它。

catch块的数量完全取决于你写的代码的类型。例如,如果您正在编写网络代码,那么您将更有可能进行更多的异常处理(因为网络本质上更可能存在需要处理的问题)。

2

作为一个非常粗略的指标,我的经验法则是每个事件处理程序中至少有一个会记录异常。

关于其他方法,我更喜欢让它们免试试;据说,有很多次我添加了catch块来为麻烦的错误报告添加状态(“parameter = value”),然后只是“抛出”到主处理程序。如果你擅长修正错误,这种方法会导致很多死代码。