当前位置: 首页 > news >正文

网站优化要怎么做才会做到最佳湖北省建设厅网站如何申诉

网站优化要怎么做才会做到最佳,湖北省建设厅网站如何申诉,网站排名优化是怎么做的,谷歌关键词搜索排名文章目录 异常日志的意义(一) 错误码(二) 异常处理(三) 日志规约附#xff1a;错误码列表 #x1f64a;前言#xff1a;本文章为瑞_系列专栏之《Java开发手册》的异常日志篇#xff0c;本篇章主要介绍异常日志的错误码、异常处理、日志规约。由于博主是从阿里的《Java开发手… 文章目录 异常日志的意义(一) 错误码(二) 异常处理(三) 日志规约附错误码列表 前言本文章为瑞_系列专栏之《Java开发手册》的异常日志篇本篇章主要介绍异常日志的错误码、异常处理、日志规约。由于博主是从阿里的《Java开发手册》学习到Java的编程规约所以本系列专栏主要以这本书进行讲解和拓展有需要的小伙伴可以点击链接下载。本文仅供大家交流、学习及研究使用禁止用于商业用途违者必究 本系列第一篇链接一编程规约 异常日志的意义 在Java开发中异常日志是非常重要的。它记录了程序运行过程中的异常信息可以帮助开发人员快速定位和解决代码中的问题提高程序的性能和稳定性。当然了异常日志也不是万能的。它只能告诉你程序出了什么问题但没法告诉你为什么会出现这个问题但有分析方向总比没有强呐。不要把异常日志当成是洪水猛兽相反应该把它当成是你的得力助手。当你遇到问题时让它帮你找出问题的所在当写完代码时让它检查可能存在的问题。 异常日志就是我们程序员的“救命稻草”想象一下你正在编写一个复杂的程序突然出现了一个莫名其妙的错误。这时优秀的异常日志就像是一根救命稻草可以帮助我们找到问题的根源。没有异常日志你可能要因为这个bug困扰几个小时甚至❌通宵❌。所以想要保住发际线就需要我们遵守开发手册中的异常日志规约养成良好的异常日志编写习惯。 图源网络 (一) 错误码 【强制】错误码的制定原则快速溯源、简单易记、沟通标准化。 说明 错误码想得过于完美和复杂就像康熙字典中的生僻字一样用词似乎精准但是字典不容易随身携带并且简单易懂。 正例错误码回答的问题是谁的错错在哪 1错误码必须能够快速知晓错误来源可快速判断是谁的问题。 2错误码易于记忆和比对代码中容易 equals。 3错误码能够脱离文档和系统平台达到线下轻量化地自由沟通的目的。 瑞注意错误码的后三位编号与 HTTP 状态码没有任何关系 【强制】错误码不体现版本号和错误等级信息。 说明错误码以不断追加的方式进行兼容。错误等级由日志和错误码本身的释义来决定。 瑞文末有附错误码列表可供参考 【强制】全部正常但不得不填充错误码时返回五个零00000。 瑞这种约定属大家公认的约定不要将其用作其它含义防止误导他人 【强制】错误码为字符串类型共 5 位分成两个部分错误产生来源四位数字编号。 说明错误产生来源分为 A/B/CA 表示错误来源于用户比如参数错误用户安装版本过低用户支付超时等问题B 表示错误来源于当前系统往往是业务逻辑出错或程序健壮性差等问题C 表示错误来源于第三方服务比如 CDN 服务出错消息投递超时等问题四位数字编号从 0001 到 9999大类之间的步长间距预留 100参考文末附表。 瑞文末附表为阿里的《Java开发手册》泰山版《附表3错误码列表》仅供参考 【强制】编号不与公司业务架构更不与组织架构挂钩一切与平台先到先申请的原则进行审批生效编号即被永久固定。 【强制】错误码使用者避免随意定义新的错误码。 说明尽可能在原有错误码附表中找到语义相同或者相近的错误码在代码中使用即可。 瑞CV复制粘贴大法好 【强制】错误码不能直接输出给用户作为提示信息使用。 说明堆栈stack_trace、错误信息(error_message)、错误码error_code、提示信息user_tip是一个有效关联并互相转义的和谐整体但是请勿互相越俎代庖。 瑞尤其是错误信息经常遇到层层嵌套的情况建议开发人员不要只测试正例也要多进行异常值测试 【推荐】错误码之外的业务独特信息由 error_message 来承载而不是让错误码本身涵盖过多具体业务属性。 【推荐】在获取第三方服务错误码时向上抛出允许本系统转义由 C 转为 B并且在错误信息上带上原有的第三方错误码。 【参考】错误码分为一级宏观错误码、二级宏观错误码、三级宏观错误码。 说明在无法更加具体确定的错误场景中可以直接使用一级宏观错误码分别是A0001用户端错误、B0001系统执行出错、C0001调用第三方服务出错。 正例调用第三方服务出错是一级中间件错误是二级消息服务出错是三级。 【参考】错误码的后三位编号与 HTTP 状态码没有任何关系。 瑞常见的 HTTP 状态码可查看Spring框架中的类org.springframework.http.HttpStatus包含 OK200、BAD_REQUEST400、NOT_FOUND404等 【参考】错误码尽量有利于不同文化背景的开发者进行交流与代码协作。 说明英文单词形式的错误码不利于非英语母语国家如阿拉伯语、希伯来语、俄罗斯语等之间的开发者互相协作。 【参考】错误码即人性感性认知口口相传使用纯数字来进行错误码编排不利于感性记忆和分类。 说明数字是一个整体每位数字的地位和含义是相同的。 反例一个五位数字 12345第 1 位是错误等级第 2 位是错误来源345 是编号人的大脑不会主动地分辨每位数字的不同含义 (二) 异常处理 【强制】Java 类库中定义的可以通过预检查方式规避的 RuntimeException 异常不应该通过catch 的方式来处理比如NullPointerExceptionIndexOutOfBoundsException 等等。 说明无法通过预检查的异常除外比如在解析字符串形式的数字时可能存在数字格式错误不得不通过 catch NumberFormatException 来实现。 正例if (obj ! null) {…} 反例try { obj.method(); } catch (NullPointerException e) {…} 【强制】异常不要用来做流程控制条件控制。 说明异常设计的初衷是解决程序运行中的各种意外情况且异常的处理效率比条件判断方式要低很多。 瑞应该使用条件语句如if-else语句来实现流程控制和条件控制。条件语句的执行效率比异常处理机制要高得多因为它们不需要创建新的异常对象、抛出异常、捕获异常等操作。此外条件语句也更加直观和易于理解可以更好地表达程序的逻辑关系 【强制】catch 时请分清稳定代码和非稳定代码稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分异常类型再做对应的异常处理。 说明对大段代码进行 try-catch使程序无法根据不同的异常做出正确的应激反应也不利于定位问题这是一种不负责任的表现。 正例用户注册的场景中如果用户输入非法字符或用户名称已存在或用户输入密码过于简单在程序上作出分门别类的判断并提示给用户。 瑞总有大聪明为了省事直接大段catch然后丢Exception但是要注意别因为遵守本条而违反上一条 【强制】捕获异常是为了处理它不要捕获了却什么都不处理而抛弃之如果不想处理它请将该异常抛给它的调用者。最外层的业务使用者必须处理异常将其转化为用户可以理解的内容。 瑞最外层的业务使用者常见为Controller层即在Controller层要对catch中的error_message进行转义 【强制】事务场景中抛出异常被 catch 后如果需要回滚一定要注意手动回滚事务。 瑞CRUD工程师最基本操作 【强制】finally 块必须对资源对象、流对象进行关闭有异常也要做 try-catch。 说明如果 JDK7 及以上可以使用 try-with-resources 方式。 瑞在JDK7 及以上的版本中推荐使用 try-with-resources 语句来自动关闭资源对象和流对象。这种方式可以简化代码并确保资源被正确关闭即使在处理异常时也是如此。如下代码所示 try (FileInputStream fis new FileInputStream(input.txt)) {// 在这里使用 fis 进行文件读取操作// ... } catch (IOException e) {// 处理异常// ... } 【强制】不要在 finally 块中使用 return。 说明try 块中的 return 语句执行成功后并不马上返回而是继续执行 finally 块中的语句如果此处存在 return 语句则在此直接返回无情丢弃掉 try 块中的返回点。 反例   private int x 0;   public int checkReturn() {     try {        // x 等于 1此处不返回        return x;      } finally {       // 返回的结果是 2       return x;      }    } 瑞❗️ 务必记住本条巨坑之一❗️ 【强制】捕获异常与抛异常必须是完全匹配或者捕获异常是抛异常的父类。 说明如果预期对方抛的是绣球实际接到的是铅球就会产生意外情况。 瑞尽量是完全匹配无脑抛Exception快乐是快乐但如果出错异常问题类型无法精准定位 【强制】在调用 RPC、二方包、或动态生成类的相关方法时捕捉异常必须使用 Throwable类来进行拦截。 说明通过反射机制来调用方法如果找不到方法抛出 NoSuchMethodException。什么情况会抛出NoSuchMethodError 呢二方包在类冲突时仲裁机制可能导致引入非预期的版本使类的方法签名不匹配或者在字节码修改框架比如ASM动态创建或修改类时修改了相应的方法签名。这些情况即使代码编译期是正确的但在代码运行期时会抛出 NoSuchMethodError。 【推荐】方法的返回值可以为 null不强制返回空集合或者空对象等必须添加注释充分说明什么情况下会返回 null 值。 说明本手册明确防止 NPE 是调用者的责任。即使被调用方法返回空集合或者空对象对调用者来说也并非高枕无忧必须考虑到远程调用失败、序列化失败、运行时异常等场景返回 null 的情况。 瑞NPEjava.lang.NullPointerException: 空指针异常。 【推荐】防止 NPE是程序员的基本修养注意 NPE 产生的场景 1 返回类型为基本数据类型return 包装数据类型的对象时自动拆箱有可能产生 NPE。 反例public int f() { return Integer 对象} 如果为 null自动解箱抛 NPE。 2 数据库的查询结果可能为 null。 3 集合里的元素即使 isNotEmpty取出的数据元素也可能为 null。 4 远程调用返回对象时一律要求进行空指针判断防止 NPE。 5 对于 Session 中获取的数据建议进行 NPE 检查避免空指针。 6 级联调用 obj.getA().getB().getC()一连串调用易产生 NPE。 正例使用 JDK8 的 Optional 类来防止 NPE 问题。 瑞真的防止NPE猿猿有责。不过个人觉得 Optional 类设计有点繁琐博主一般都是使用条件语句进行判断 【推荐】定义时区分 unchecked / checked 异常避免直接抛出 new RuntimeException()更不允许抛出 Exception 或者 Throwable应使用有业务含义的自定义异常。推荐业界已定义过的自定义异常如DAOException / ServiceException 等。 【参考】对于公司外的 http/api 开放接口必须使用“错误码”而应用内部推荐异常抛出跨应用间 RPC 调用优先考虑使用 Result 方式封装 isSuccess()方法、“错误码”、“错误简短信息”而应用内部推荐异常抛出。 说明关于 RPC 方法返回方式使用 Result 方式的理由 1使用抛异常返回方式调用方如果没有捕获到就会产生运行时错误。 2如果不加栈信息只是 new 自定义异常加入自己的理解的 error message对于调用端解决问题 的帮助不会太多。如果加了栈信息在频繁调用出错的情况下数据序列化和传输的性能损耗也是问题。 【参考】避免出现重复的代码Don’t Repeat Yourself即 DRY 原则。 说明随意复制和粘贴代码必然会导致代码的重复在以后需要修改时需要修改所有的副本容易遗漏。必要时抽取共性方法或者抽象公共类甚至是组件化。 正例一个类中有多个 public 方法都需要进行数行相同的参数校验操作这个时候请抽取private boolean checkParam(DTO dto) {…} (三) 日志规约 【强制】应用中不可直接使用日志系统Log4j、Logback中的 API而应依赖使用日志框架SLF4J、JCL–Jakarta Commons Logging中的 API使用门面模式的日志框架有利于维护和 各个类的日志处理方式统一。 说明日志框架SLF4J、JCL–Jakarta Commons Logging的使用方式推荐使用 SLF4J 使用 SLF4J import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger LoggerFactory.getLogger(Test.class);使用 JCL import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; private static final Log log LogFactory.getLog(Test.class);瑞吹爆SLF4J以下为 logback.xml 配置示例 ?xml version1.0 encodingUTF-8? configurationxmlnshttp://ch.qos.logback/xml/ns/logbackxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://ch.qos.logback/xml/ns/logback logback.xsdappender nameSTDOUT classch.qos.logback.core.ConsoleAppenderencoderpattern%date{HH:mm:ss.SSS} [%t] %logger - %m%n/pattern/encoder/appenderlogger namecom.ray.yourpackage leveldebug additivityfalseappender-ref refSTDOUT//loggerroot levelERRORappender-ref refSTDOUT//root /configuration 【强制】所有日志文件至少保存 15 天因为有些异常具备以“周”为频次发生的特点。对于当天日志以“应用名.log”来保存保存在/home/admin/应用名/logs/目录下过往日志格式为: {logname}.log.{保存日期}日期格式yyyy-MM-dd 说明以 mppserver 应用为例日志保存在/home/admin/mppserver/logs/mppserver.log历史日志名称为 mppserver.log.2016-08-01 瑞其实15天都不够空间条件允许的情况下建议增加天数毕竟不怕一万就怕万一 【强制】应用中的扩展日志如打点、临时监控、访问日志等命名方式appName_logType_logName.log。logType:日志类型如 stats/monitor/access 等logName:日志描述。这种命名的好处通过文件名就可知道日志文件属于什么应用什么类型什么目的也有利于归类查找。 说明推荐对日志进行分类如将错误日志和业务日志分开存放便于开发人员查看也便于通过日志对系统进行及时监控。 正例mppserver 应用中单独监控时区转换异常如mppserver_monitor_timeZoneConvert.log 【强制】在日志输出时字符串变量之间的拼接使用占位符的方式。 说明因为 String 字符串的拼接会使用 StringBuilder 的 append()方式有一定的性能损耗。使用占位符仅是替换动作可以有效提升性能。 正例logger.debug(“Processing trade with id: {} and symbol: {}”, id, symbol); 【强制】对于 trace/debug/info 级别的日志输出必须进行日志级别的开关判断。 说明虽然在 debug(参数)的方法体内第一行代码 isDisabled(Level.DEBUG_INT)为真时Slf4j 的常见实现Log4j 和 Logback就直接 return但是参数可能会进行字符串拼接运算。此外如果 debug(getName())这种参数内有 getName()方法调用无谓浪费方法调用的开销。 正例 // 如果判断为真那么可以输出 trace 和 debug 级别的日志if (logger.isDebugEnabled()) {logger.debug(Current ID is: {} and name is: {}, id, getName());}【强制】避免重复打印日志浪费磁盘空间务必在 log4j.xml 中设置 additivityfalse。 正例logger name“com.taobao.dubbo.config” additivity“false” 瑞可参考本小节第一条土豪请随意 【强制】生产环境禁止直接使用 System.out 或 System.err 输出日志或使用 e.printStackTrace() 打印异常堆栈。 说明标准日志输出与标准错误输出文件每次 Jboss 重启时才滚动如果大量输出送往这两个文件容易造成文件大小超过操作系统大小限制。 瑞不仅仅是在生产环境开发环境也建议少用这两条输出指令很多时候出问题就是由于某个死循环中存在这两条语句 【强制】异常信息应该包括两类信息案发现场信息和异常堆栈信息。如果不处理那么通过关键字 throws 往上抛出。 正例logger.error(各类参数或者对象 toString() “_” e.getMessage(), e); 【强制】日志打印时禁止直接用 JSON 工具将对象转换成 String。 说明如果对象里某些 get 方法被重写存在抛出异常的情况则可能会因为打印日志而影响正常业务流程的执行。 正例打印日志时仅打印出业务相关属性值或者调用其对象的 toString()方法。 【推荐】谨慎地记录日志。生产环境禁止输出 debug 日志有选择地输出 info 日志如果使用warn 来记录刚上线时的业务行为信息一定要注意日志输出量的问题避免把服务器磁盘撑爆并记得及时删除这些观察日志。 说明大量地输出无效日志不利于系统性能提升也不利于快速定位错误点。记录日志时请思考这些日志真的有人看吗看到这条日志你能做什么能不能给问题排查带来好处 【推荐】可以使用 warn 日志级别来记录用户输入参数错误的情况避免用户投诉时无所适从。如非必要请不要在此场景打出 error 级别避免频繁报警。 说明注意日志输出的级别error 级别只记录系统逻辑出错、异常或者重要的错误信息。 【推荐】尽量用英文来描述日志错误信息如果日志中的错误信息用英文描述不清楚的话使用中文描述即可否则容易产生歧义。 说明国际化团队或海外部署的服务器由于字符集问题使用全英文来注释和描述日志错误信息。 附错误码列表 以下为阿里的《Java开发手册》泰山版《附表3错误码列表》 错误码中文描述说明00000一切 ok正确执行后的返回A0001用户端错误一级宏观错误码A0100用户注册错误二级宏观错误码A0101用户未同意隐私协议A0102注册国家或地区受限A0110用户名校验失败A0111用户名已存在A0112用户名包含敏感词A0113用户名包含特殊字符A0120密码校验失败A0121密码长度不够A0122密码强度不够A0130校验码输入错误A0131短信校验码输入错误A0132邮件校验码输入错误A0133语音校验码输入错误A0140用户证件异常A0141用户证件类型未选择A0142大陆身份证编号校验非法A0143护照编号校验非法A0144军官证编号校验非法A0150用户基本信息校验失败A0151手机格式校验失败A0152地址格式校验失败A0153邮箱格式校验失败A0200用户登陆异常二级宏观错误码A0201用户账户不存在A0202用户账户被冻结A0203用户账户已作废A0210用户密码错误A0211用户输入密码次数超限A0220用户身份校验失败A0221用户指纹识别失败A0222用户面容识别失败A0223用户未获得第三方登陆授权A0230用户登陆已过期A0240用户验证码错误A0241用户验证码尝试次数超限A0300访问权限异常二级宏观错误码A0301访问未授权A0302正在授权中A0303用户授权申请被拒绝A0310因访问对象隐私设置被拦截A0311授权已过期A0312无权限使用 APIA0320用户访问被拦截A0321黑名单用户A0322账号被冻结A0323非法 IP 地址A0324网关访问受限A0325地域黑名单A0330服务已欠费A0340用户签名异常A0341RSA 签名错误A0400用户请求参数错误二级宏观错误码A0401包含非法恶意跳转链接A0402无效的用户输入A0410请求必填参数为空A0411用户订单号为空A0412订购数量为空A0413缺少时间戳参数A0414非法的时间戳参数A0420请求参数值超出允许的范围A0421参数格式不匹配A0422地址不在服务范围A0423时间不在服务范围A0424金额超出限制A0425数量超出限制A0426请求批量处理总个数超出限制A0427请求 JSON 解析失败A0430用户输入内容非法A0431包含违禁敏感词A0432图片包含违禁信息A0433文件侵犯版权A0440用户操作异常A0441用户支付超时A0442确认订单超时A0443订单已关闭A0500用户请求服务异常二级宏观错误码A0501请求次数超出限制A0502请求并发数超出限制A0503用户操作请等待A0504WebSocket 连接异常A0505WebSocket 连接断开A0506用户重复请求A0600用户资源异常二级宏观错误码A0601账户余额不足A0602用户磁盘空间不足A0603用户内存空间不足A0604用户 OSS 容量不足A0605用户配额已用光蚂蚁森林浇水数或每天抽奖数A0700用户上传文件异常二级宏观错误码A0701用户上传文件类型不匹配A0702用户上传文件太大A0703用户上传图片太大A0704用户上传视频太大A0705用户上传压缩文件太大A0800用户当前版本异常二级宏观错误码A0801用户安装版本与系统不匹配A0802用户安装版本过低A0803用户安装版本过高A0804用户安装版本已过期A0805用户 API 请求版本不匹配A0806用户 API 请求版本过高A0807用户 API 请求版本过低A0900用户隐私未授权二级宏观错误码A0901用户隐私未签署A0902用户摄像头未授权A0903用户相机未授权A0904用户图片库未授权A0905用户文件未授权A0906用户位置信息未授权A0907用户通讯录未授权A1000用户设备异常二级宏观错误码A1001用户相机异常A1002用户麦克风异常A1003用户听筒异常A1004用户扬声器异常A1005用户 GPS 定位异常B0001系统执行出错一级宏观错误码B0100系统执行超时二级宏观错误码B0101系统订单处理超时B0200系统容灾功能被触发二级宏观错误码B0210系统限流B0220系统功能降级B0300系统资源异常二级宏观错误码B0310系统资源耗尽B0311系统磁盘空间耗尽B0312系统内存耗尽B0313文件句柄耗尽B0314系统连接池耗尽B0315系统线程池耗尽B0320系统资源访问异常B0321系统读取磁盘文件失败C0001调用第三方服务出错一级宏观错误码C0100中间件服务出错二级宏观错误码C0110RPC 服务出错C0111RPC 服务未找到C0112RPC 服务未注册C0113接口不存在C0120消息服务出错C0121消息投递出错C0122消息消费出错C0123消息订阅出错C0124消息分组未C0130缓存服务出错C0131key 长度超过限制C0132value 长度超过限制C0133存储容量已满C0134不支持的数据格式C0140配置服务出错C0150网络资源服务出错C0151VPN 服务出错C0152CDN 服务出错C0153域名解析服务出错C0154网关服务出错C0200第三方系统执行超时二级宏观错误码C0210RPC 执行超时C0220消息投递超时C0230缓存服务超时C0240配置服务超时C0250数据库服务超时C0300数据库服务出错二级宏观错误码C0311表不存在C0312列不存在C0321多表关联中存在多个相同名称的列C0331数据库死锁C0341主键冲突C0400第三方容灾系统被触发二级宏观错误码C0401第三方系统限流C0402第三方功能降级C0500通知服务出错二级宏观错误码C0501短信提醒服务失败C0502语音提醒服务失败C0503邮件提醒服务失败 本文是博主的粗浅理解可能存在一些错误或不完善之处如有遗漏或错误欢迎各位补充谢谢 如果觉得这篇文章对您有所帮助的话请动动小手点波关注你的点赞收藏⭐️转发评论都是对博主最好的支持~
http://www.tj-hxxt.cn/news/139991.html

相关文章:

  • 那里有网站建设设计师网名大全
  • 西樵网站设计制作企业管理系统简称
  • 昆明品牌网站建设网络教学平台昆明理工大学
  • 网站的大小网站开发行业资讯
  • 电子商务网站建设含代码网站空间价格
  • 网站建设技术开发wordpress cms模版
  • 地方网站做外卖初中做语文综合题的网站
  • wordpress免费建站研究院网站建设
  • 一流的南昌网站建设设计软件基础课程学什么
  • 论坛类网站如何备案cpanel 子网站
  • 厦门做网站哪家好网站开发python
  • 响应式网站制作软件相亲网站上做绿叶的女人很多
  • 建设银行重庆市分行官方网站网站备案到公司
  • 网站中添加百度地图网站建设服务费怎么记账
  • 买链接做网站 利润高吗女装网站功能的建设
  • 360网站收录提交百度应用下载安装
  • 网站与云平台区别自学网站
  • 招聘网站套餐建设一个网站要多
  • 做网站服务器多大的好小程序微盟
  • 深圳教育 网站建设微网站模板在线制作
  • 没有备案的网站 推广网站备案幕布尺寸
  • 杭州高端网站开发晋江论坛匿名区
  • 微擎 网站开发工具成都新都网站开发
  • 网站建设超市酒吧网站模板
  • 网站网站弹出窗口去掉济南公司网站建设价格
  • 网站建设的模块梧州seo快速排名
  • 网站建设二团队做的怎样 英文网站
  • 万盛经开区规划建设局网站陕西省煤炭建设第一中学官方网站
  • 山西成宁做的网站iis7安装wordpress
  • 青岛网站建设收费哪个平台好宣传片制作合同模板