Code Style Guidelines for Contributors (一)

来源:互联网 发布:java设置时区的方法 编辑:程序博客网 时间:2024/05/22 16:42

Code Style Guidelines for Contributors 代码提交风格指导(一)

原文链接:http://source.android.com/source/code-style.html

偶然在查看android文档时看到的这篇代码风格指南,索性拿来翻译一下,一则多学习点知识,而来也可锻炼下就已为用的英文,文中翻译不当之处,恳请指正;


      以下规则不是选择性的建议,而是必须严格遵守的规则。所有的Android代码的提交都必须遵守否则代码将不会被认可接受。需要注意的是,不是所有的代码都遵守了这些规则,但是新的代码提交必须遵守。

Java Language Rules Java语言规则
我们遵循标准的Java代码命名约定,同时我们也新增了一些规则:

    Don't Ignore Exception 切勿忽略异常
   有的时候编码人员可能会写出如下完全忽略异常的代码断:

1 void setServerPort(String value) {2 try {3     serverPort = Integer.parseInt(value);4     } catch (NumberFormatException e) { }5 }

任何情况下你都不应该这么做。也许你可能认为你的代码巨对不会出现这种异常情况或者不值得处理,但是上述忽略异常将给你的代码留下不易察觉的的潜在漏洞,特别是日后其他人来维护这些代码的时候。因此你必须以某种规则来处理代码中可能出现的任何异常。处理的方式视情况而定。

James Gosling曾经说过,“任何时候我们的代码出现空的catch捕获时都将给人一种毛骨悚然的感觉。当然肯定有确实可以这么写的时候,但是我们至少应当考虑这个问题。在Java中 你很难完全避免这种不好的感觉。

可行的处理方式如下(优先顺序):
1.向上抛出异常;

1 void setServerPort(String value) throws NumberFormatException {2       serverPort = Integer.parseInt(value);3 }

2.根据情况抛出一个恰当的新异常;

1 void setServerPort(String value) throws ConfigurationException {2 try {3        serverPort = Integer.parseInt(value);4      } catch (NumberFormatException e) {5          throw new ConfigurationException("Port " + value + " is not valid.");6      }7 }

3.恰当地处理错误并且在catch中重新赋值;

/** Set port. If value is not a valid number, 80 is substituted. */void setServerPort(String value) {      try {             serverPort = Integer.parseInt(value);            } catch (NumberFormatException e) {            serverPort = 80; // default port for server            }}

4.捕获异常并且抛出新的运行时异常。这种处理方式是危险的:仅在你认为出现该异常时应当crash的时候使用。

1 /** Set port. If value is not a valid number, die. */2 3 void setServerPort(String value) {4 try {5     serverPort = Integer.parseInt(value);6 } catch (NumberFormatException e) {7      throw new RuntimeException("port " + value " is invalid, ", e);8 }9 }

备注:原始异常被传递给运行时异常的构造器。如果你的代码在Java1.3以下编译,那么你需要忽略这个异常。

5.最后措施:如果你有足够的信心,认为忽略异常是最合适的做法,那么你可以这样做,但是你应当在此处添加注释,写出一个好的理由。

1 /** If value is not a valid number, original port number is used. */2 void setServerPort(String value) {3 try {4     serverPort = Integer.parseInt(value);5 } catch (NumberFormatException e) {6 // Method is documented to just ignore invalid user input.7 // serverPort will just be unchanged.8    }9 }

Don't Catch Generic Exception 不要捕获一般的异常

1 try {2     someComplicatedIOFunction(); // may throw IOException 3     someComplicatedParsingFunction(); // may throw ParsingException 4     someComplicatedSecurityFunction(); // may throw SecurityException 5 // phew, made it all the way 6 } catch (Exception e) { // I'll just catch all exceptions 7      handleError(); // with one generic handler!8 }

 

你不应该写上面这样的代码。在几乎所有的情况下,这种一般的异常捕获或Throwable对象是不恰当的,尤其是Throwable对象,应为他本身包含了错误异常。这是很危险的,这种写法意味着你未预料到的异常也会被捕获(包括运行时异常和空指针异常)。这将掩盖你的代码异常处理性能。这也意味着如果有其他人添加了新的异常到你调用的代码中,编译器将不会提醒你需要额外处理这种情况。在大多情况下,你不应当用一样的方法来处理不同的异常。
当然这种规则下,也有少数一些异常例外:某些你需要捕获所有错误的特定的测试代码或者上层代码里面(以免异常信息出现在用户界面)。在这中情况下,你可以用一般的异常捕获来正确处理这些错误。当然你在这么做之前也应当深思熟虑,而且需要给出注释,写明你这样做的缘由。

捕获一般异常的替代方案如下:
1.在每个try语句后独立catch代码。这样虽显麻烦,但也不失为捕获所有异常的良方。需要避免在各个catch中产生大量重复的代码;
2.重构你的代码以便更好地用try/catch处理错误。剥离IO解析,分开处理各种情况;
3.重新抛出异常。很多时候你并不需要在当前层次直接捕获异常,那么向外抛就可以了。
切忌:异常并不是什么坏事,当编译器报告异常时,不要不耐烦皱眉。愉快的直面他就好了,因为编译器使得你更容易在运行时捕获代码中的错误。
未完待续...

 

0 0
原创粉丝点击