2015-04-06 96 views
0

你认为捕捉异常并重新抛出它是一种很好的做法吗?重新抛出异常好习惯吗?

基本上我有一段代码,其中使用3个参数的构造函数创建一个颜色。颜色构造函数可能会抛出异常。

public PointExtend(double x, double y, int r, int g, int b) 
     : base(x, y) 
    { 
     try 
     { 
      var color = new Color(r, g, b); 
      Color = color;     
     } 
     catch (InvalidColorValueException) 
     { 
      throw; 
     } 
    } 

ReSharper的说,渔获掷条款是多余的,我同意,考虑到我没有做任何不同之处,但再次抛出它,如果我不是,它会泄漏无论如何UI,但是,这不是”这段代码让程序员更容易阅读,所以如果他创建了PointExtend,他会知道代码可能抛出什么?

+1

我把它变得毫无意义,除非你抛出定制的异常 – bit 2015-04-06 07:27:08

+2

'catch/throw' * *是多余的。这相当于根本没有捕获。这不是更简洁的代码,它是一个意外的惊喜,并且试图理解作者的意思,以及代码中是否缺少某些东西 – 2015-04-06 07:28:24

+0

您的好习惯是什么意思?你想达到什么目的? – 2015-04-06 07:35:06

回答

0

如果您希望程序员知道某些使用注释。 捕捉和抛出异常是一种开销,并且是无用的(除非你在重抛之前对它做了什么,例如记录它),所以程序员实际上会感到困惑,认为存在一个bug并且不理解最初的意图是什么。

+0

npinti提到了///总结,我想我会从现在开始使用它。尽管如此,感谢您的答复。我很感激Petar。 – 2015-04-06 07:39:01

+0

需要评论的代码是不好的代码。重写代码以便它自己记录。 – 2015-04-06 07:57:44

+0

@PhilipStuyck我应该如何重写代码的这个特定部分,一部分,创建的对象可能会抛出异常?在这种情况下,我认为一些文档是必要的。 – 2015-04-06 14:59:22

0

正如你所说,上面代码中的throw是毫无意义的,所有运行时将会做的只是重新抛出相同的异常。你可以删除try catch,它的功能是一样的。

如果你对异常本身做了某些事情,那就是抓住它的原因,否则就让它冒出来,给用户一个有意义的消息,把它记录在错误日志中,然后你就不会给用户一个废话异常弹出:)

1

除非你正在做任何特定的日志记录或异常包装,你可以删除它。

如果你想在程序员知道约可能是个例外,其记录下来:

/// <summary> 
/// Creates a new instance of <code>PointExtend</code> 
/// </summary> 
/// <param name="x">...</param> 
/// <param name="y">...</param> 
/// <param name="r">...</param> 
/// <param name="g">...</param> 
/// <param name="b">...</param> 
/// <exception cref="InvalidColorValueException">Should the provided rgb values be out of range</exception> 
public PointExtend(double x, double y, int r, int g, int b) 
     : base(x, y) 
    {    
      var color = new Color(r, g, b); 
      Color = color;        
    } 

这将允许其消耗你的API其他程序员知道什么是构造函数和任何潜在的缺陷。不是每个人都可以访问你的代码。

编辑:根据@Philip Stuyck的评论,尽管我同意,但我认为我们并不生活在理想的世界。您推荐的问题是:

  • 如果您需要发送DLL的混淆版本,会发生什么情况?这通常发生在公司销售其DLL时。您无法真正查看代码,而方法名称只能走得这么远。
  • 大多数项目往往不仅仅是少数几个类,而且每次通过代码来弄清楚发生了什么会花费很多时间,并且可能使人们无法使用您的产品。在我看来,开源项目是this的一个明确例子。
  • 最后,更重要的是,在我看来,您说的代码所做的唯一部分是摘要部分(至少对于.NET而言)。评论和文件应该揭示为什么是一个选定的方法。
+0

这实际上很整洁,我彻底忘记了C#提供的///汇总能力,谢谢。 – 2015-04-06 07:38:27

+0

@OndřejŠimon:在一个理想的世界里,代码*应该被记录下来,因为你永远不知道谁会从别人的位置开始工作。 – npinti 2015-04-06 07:41:01

+0

这些都是我的项目,对于学校来说,但我想你应该学会在你的小型项目上进行良好的编程,所以在处理大型项目时,其他程序员不会在阅读代码时遇到问题。 – 2015-04-06 07:43:11

0

你真的从这里试图说服你,你应该记录你的代码的人不好的建议。

只有写得不好的代码才需要注释,而不是花时间撰写评论和评论,在代码中花费这些努力,以便它根本不需要评论。

这是否意味着所有评论都是邪恶的。不,当然不。有些情况下仍然需要评论,因为编程语言并不总是最适合描述发生的事情。但即使如此,也必须小心谨慎,因为评论将开始过上自己的生活。

http://apdevblog.com/comments-in-code/

是由罗伯特C.马丁

清洁守则博客中有一个在这本书有关的评论整整一章,那些谁认为你需要更好的注释读了书。

在你的具体情况下,如果你真的觉得代码更好,当你赶上例外,然后重新抛出没有额外的,通过一切手段让它进入。 个人我会离开它。但对我来说,这只是一个风格问题。与同事达成协议,并在团队中保持一致。

我在这里的答案可能会引起很大的争议,你对这个问题都有自由意见。 (罗伯特马丁说同样的事情;-))但事实是,在很多情况下,评论只是混淆了代码并降低了可读性。评论被遗忘更新,因此不再与真实代码内联,...

另一种记录所有事情的方法是编写好的单元测试。通过阅读单元测试的代码,如果它们写得很好,你将会明白代码应该如何使用。那就是如果你正在写一个API供其他人使用。

写得很好的代码也很好地分层,不需要在系统中的每一个类中进行分解。如果你必须这样做才能理解代码,那么结论也是一样的。这是错误的代码。

方法名称和变量名称,类名称走得很远。在阅读完整代码之后,我大大改变了我的代码风格。

我写软件已有20年了,我已经看到了,写了很多评论。在很多情况下,他们仍然不清楚他们在评论中的真正含义,或者评论仅仅是错误的。

+0

感谢您对此回复的评价,菲利普。所以你实际上认为我应该删除try catch子句,然后再去另一个程序员,有人会在我的代码上工作,应该单独指出,Color构造函数实际上可能会抛出异常,这意味着他必须打开Color类而不是直接在PointExtend类中看到它?我并不喜欢评论,但我尝试编写可理解的代码,但到目前为止,我们主要使用C++编写算法,并且直到最近才引入整个Exception概念。 – 2015-04-06 17:29:00

+0

这是我在团队会议上采取的立场,以消除尝试捕获。但是如果球队做出不同的决定,我会跟进球队的决定。在设计时,Sw不总是黑白的。 – 2015-04-06 17:41:26