阿里java开发手册针对开发中的异常日志部分,制定了详细的规范,具体分为了三个部分(1,错误码; 2,异常处理; 3,日志规约;),如果能够严格遵守,则能够很大程度上提升bug处理的效率和问题处理的沟通效率,具体如下:
一,错误码
-
1,错误码的制定原则:快速溯源、简单易记、沟通标准化。
-
2,错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号。
解读:错误产生来源可分为A/B/C类,A表示用户端错误,B表示系统服务端错误,C表示调用第三方错误;具体可参考手册的附表3; -
3,错误码使用避免随意定义新的错误码; 解读:容易造成版本混乱,降低错误码本身的使用价值;
-
4,错误码不能直接输出给用户作为提示信息使用;
解读:用户看不懂错误码,这降低了用户体验;
二,异常处理
-
1,可以通过预检查方式规避的RuntimeException 异常不应该通过catch 的方式来处理,eg:NPE异常;
-
2,异常不能用来做条件和流程控制;
-
3,catch到异常后必须进行处理,如果不处理,将该异常抛给它的调用者;
-
4,事务场景中,必须注意出现异常后的事务回滚问题;
-
5,finally 块中必须对相关资源/流进行关闭,有异常也要try-catch;
解读:java7及以上环境,使用带资源的try语句; -
6,禁止在finally中进行return;
-
7, 在调用 RPC、二方包、或动态生成类的相关方法时,捕捉异常必须使用 Throwable来进行拦截;
解读: eg:二方包在类冲突时,仲裁机制可能导致引入非预期的版本使类的方法签名不匹配,代码编译期是正确的,但在代码运行期时,会抛出 NoSuchMethodError; -
8,防止NPE,是程序员的基本素养,针对可能出现NPE的场景必须要熟悉;
三,日志规约
-
1,应用中不能直接使用日志系统
Log4j/Logback中api,要使用SLF4J/JCL中api,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一; -
2,所有日志文件至少保存 15 天,因为有些异常具备以“周” 为频次发生,对于当天日志,以“应用名.log” 来保存,保存在
/应用名/logs目录下,过往日志格式为: {logname}.log.{保存日期}; -
3,日志输出时,string直接拼接使用占位符的方式;
解读:使用占位符仅是替换动作,可以有效提升性能; -
4,避免重复打印日志,浪费存储空间, log4j.xml 中务必设置 additivity=false;
-
5,生产环境禁止直接使用 System.out 或 System.err 输出日志或使e.printStackTrace()打印异常堆栈;
-
6,异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理则通过关键字 throws 往上抛出;