《码出高效》五 异常与日志

news2024/11/18 13:54:39

前言

本章主要是讲异常处理,关于异常主要有三个问题:
哪里发生异常
谁来处理异常
如何处理异常
围绕这三个问题就有了一套异常处理机制

异常分类

通常异常时针对不稳定代码的,并且需要区分类型

  • throw和throws的区别:
    **在这里插入图片描述**
    以此段代码为例,thrwo是方法内部具体抛出异常的关键字,thrwos则跟在方法签名,表示方法可以向上抛出异常
  • 异常被捕获后,如果没有必要对外透出且方法可以处理,就直接捕获并处理;否则向上抛出,由上层方法和框架处理
  • 异常捕获后,必须根据业务场景进行相应处理,例如重试,回滚等,打印日志和抛出也需要添加好参数,便于定位问题
  • JDK的异常机制中,Throwable是所有异常父类
  • 在这里插入图片描述
    如图,异常分为Error(致命异常)和Exception(非致命异常) ,Excepttion又可以分为checkde异常(受检异常)和unchecked异常(非受检异常),
  • Error一般是无法由程序处理,只能人工介入的,如StackOverflowError、
    OutofMemoryError
  • checked受检异常就是需要在代码里处理的异常,否则会编译错误,例如sqlexception,ClassnotFoundException,这类细分出的引起注意类就是没法处理的,例如sql异常重试也无用,只能保存现场,调试解决,可处置的比如unauthorized异常,就可以跳转到权限申请页面
  • unchecked异常,常见叫法是runtimeException,运行时异常,因为他们继承于这个接口,不需要程序进行显式捕捉和处理
  • 细分可分为三类:
  • 可预测异常Predicted Exception:例如IndexOutOtBoundsException 、NullPointerException 等,这种异常不应该产生,可以提前检查判断避免
  • 需捕捉异常( Caution Exception ),例如远程调用超时DubboTimeoutException,客户端需显式处理
  • 可透出异常
    Ignored Exception,此类框架或者系统会自行处理,程序无需关系

文章中有一个很好的例子,出国旅行
机场地震,不可抗力,属于error,做计划时不需要考虑这些异常
中途堵车,属于checked异常,可以提前出发或者改签,其中飞机延误需要check但无能为力
没有带护照,可以提前预料,是可预测异常
车子损坏,属于需要捕捉异常,必须处理
检票机器故障,可透出异常,无需乘客关心

try代码块

  • try-catch-finally三者中,try必不可少,另外两个至少存在一个
    try:监视代码执行过程,有异常则跳转到catch,没有catch,则跳转到finally
    catch:没有异常就不执行,有异常就处理或向上抛出
    finally:是否有异常都会执行,outofMemoryError也会执行
    没有执行可能有三种情况:
    · 没有进入try 代码块。
    · 进入try 代码块, 但是代码运行中出现了死循环或死锁状态。
    · 进入try 代码块, 但是执行了System. exit() 操作。
    在这里插入图片描述
    在这里插入图片描述
  • 如上,程序输出10001,说明finally是在return后执行的,return的结果会暂存,执行finally后输出暂存结果
  • 在finally中做操作非常危险,会使得结果不可控
  • try与锁的关系
    在这里插入图片描述
    这段代码中,可能出现lock方法报出的unchecked异常,之后执行finally对未加锁的对象解锁造成程序中断,加锁失败的原因就会被覆盖,那么把红色部分放到try的上方
  • 例如Lock 、ThreadLocal 、InputStream这些都需要在finally中进行显式清理,避免内存泄露

异常的抛与接

  • 异常处理中,被捕获的异常需要是被抛出异常的父类
  • 远程服务调用中推荐使用result对象封装异常信息,因为抛异常返回的话,可能出现调用方法没有捕获,出现运行时错误,进而程序中断;还有就是添加栈信息会造成很大传输消耗,不添加又不便定位错误
  • 为了防止空指针异常,需要方法返回值可以为null,当然需要注释返回null的情况

日志

日志就像航空领域的黑匣子,一般是记录操作轨迹,监控系统运行状况,回溯系统故障
日志规范:
推荐命名规范为appName_logType logName.log,logType即日志类型,logName即日志描述
日志的保存时间:推荐保存时间为15天,根据重要程度,文件大小,磁盘空间可自行延长时间
日志级别:
• DEBUG 级别曰志记录对调试程序有帮助的信息。
• INFO 级别日志用来记录程序运行现场,虽然此处并未发生错误,但是对排
查其他错误具有指导意义。
• WARN 级别日志也可以用来记录程序运行现场,但是更偏向于表明此处有出
现潜在错误的可能。
• ERROR 级别日志表明当前程序运行发生了错误,需要被关注。但是当前发
生的错误,没有影响系统的继续运行。
• FATAL 级别曰志表明当前程序运行出现了严重的错误事件,并且将会导致应
用程序中断。

  • 打印日志时需要注意的点
    1.预先判断日志级别
    在这里插入图片描述
    判断后再拼接,这样不会浪费系统资源,不需处理字符串
    2.避免无效日志打印
    生产环境禁止输出debug日志且有选择地输出info日志,使用info,warn级别时要控制日志输出量,节约磁盘,及时清理日志
    避免重复打印,务必在日志配置文件中设置additiv ity=false ,
    在这里插入图片描述
    3.区别对待错误日志
    warn,error都是与错误有关的日志,但不能笼统输出为error,因为这个就需要人为处理了
    除了系统逻辑错误,异常,或者违反业务规则,都可以归类为warn级别

4.保证记录内容完整
打印时需要注意两点
在这里插入图片描述

日志框架

log4j,logback,jdk-logging,slf4j,commons-logging如上,是日志框架间的关系
1.日志门面
门面设计模式是面向对象设计模式的一种,它一般提供一套接口规范,自身不负责日志功能实现,使用者不需关注底层日志库,
2.日志库
开发者需要关注日志库的具体细节,比如logback或slf4j
3.日志适配器
日志门面适配器:slf4j规范是后提出的,之前的日志库没有实现这个接口,那么就需要适配器解决接口不兼容问题
日志库适配器:一些老项目里直接用api实现日志,之后要改为门面模式,就需要适配器完成迁移

  • 实际项目使用
    新工程推荐使用slf4j+logback
    在这里插入图片描述

老工程需要根据日志库确定门面适配器
在这里插入图片描述
在这里插入图片描述
如果用log4j的接口打印日志,还需要引入日志库适配器
在这里插入图片描述

之后再加入一个日志配置文件,logback.xml或者log4j.xml就可以打印日志
在这里插入代码片
private static final Logger logger= LoggerFactory.getLogger(Abc . class );这样定义可以避免new新对象,浪费内存资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

session条件竞争

PHP SESSION 的存储 Session会话存储方式 PHP将session以文件的形式存储服务器的文件中,session.save_path来控制 默认路径 /var/lib/php/sess_PHPSESSID /var/lib/php/sessions/sess_PHPSESSID /tmp/sess_PHPSESSID /tmp/sessions/sess_PHPSESSID session文件默…

PS图层+移动工具(2)复制删除快捷键 图层分组 前景色填充

查看此文前 你需要先读 PS图层移动工具(1)图层概念-拖动操作-移动工具基础 其实显示变换控件 这个配置相对 是容易造成错误操作 不小心就把文件拖动了 当我们想调这些时 可以直接 按住键盘上的 CtrlT 然后点击图层 这个操作框就出来了 然后调好之后 还是 直接用鼠标双击图层 就…

荧光染料Sulfo-Cyanine 7 Tyramide,Tyramide-Sulfo-Cy7,磺酸基-花青素Cy7 酪酰胺

一:产品描述 1、名称 英文:Sulfo-Cyanine 7 Tyramide,Tyramide-Sulfo-Cy7 中文:磺酸基-花青素Cy7 酪酰胺 2、所属分类:Cyanine 3、分子式:C43H51N3O8S2 4、分子量:802.01 5、质量控制&am…

二叉树的序列化与反序列化

二叉树的序列化与反序列化 通俗的说就是给定一个二叉树的根节点,用某种方法将树结构的信息存到一个字符串中,并且还可以用这一个字符串还原这棵树。 本文介绍两种方法,分别为递归法和迭代法。 剑指 Offer 37. 序列化二叉树 递归法 序列化&a…

final域的内存语义

重排序规则 1. 在构造函数内对一个final域的写入,与随后把这个被构造对象引用赋值给一个引用变量,着两个操作不能重排序 2. 初次读一个包含final域的对象的引用,与随后初次读取这个final域,这两个操作不能重排序 以下面实例作说明…

基于ssm作业管理系统

随着计算机以及网络的普及,教师与学生对辅助教学方式的要求也越来越高,在教学辅助方式上追求质量及效率。作为教学核心组成之一的作业管理也趋向更加便 捷快速的方式。 经过调查,现阶段高校进行作业管理的方式主要有三种: 情况一&…

SSM学生宿舍管理系统(附源码)

本次介绍的是一个基于SSMJSP开发的学生宿舍管理系统的设计与实现,界面简洁、程序逻辑清晰,适合作为毕业设计的模板参考! 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家 …

阿里妈妈star论文重点记录

论文地址:https://arxiv.org/pdf/2101.11427.pdf 1:业务实际应用 自 2020 年底以来,STAR 已部署在阿里巴巴展示广告系统,点击率提升8.0%和RPM增加6% 2:特点 星型拓扑促进跨多个domain的有效信息转换,在…

MATLB|抽水蓄能电站系统的最优竞价策略研究

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

Python自动化测试面试题——接口篇

目录 网络模型 OSI有哪几层,分别包含哪些协议? 协议 TCP,UDP的区别? TCP如何确保可靠传输? 三次握手与四次挥手? HTTP有哪些请求方法? HTTP常见的状态码有哪些? GET和POST的区别? Cookie和Session的区别? Token和Session的区别? HTTP和HTTPS的区别? 接口…

JavaScript(二):变量、数据类型、类型转换

变量一、变量的使用1.声明变量2.赋值3.变量的初始化4.变量的更新5.同时声明多个变量6.声明变量的特殊情况7.变量的命名规则二、数据类型数字型1.数字型Number2.数字型范围3.数字型的特殊值4.isNaA()字符串型String1.字符串型格式2.字符串型引号嵌套3.字符串转义符4.字符串长度5…

R语言相关分析和稳健线性回归分析

介绍 下面以物种多样性为例子展示了如何在R语言中进行相关分析和线性回归分析。 怎么做测试 相关和线性回归示例 Data read.table(textConnection(Input),headerTRUE) 数据简单图 plot(Species ~ Latitude, dataData, pch16,xlab "Latitude", ylab "Specie…

web前端期末大作业:体育网页主题网站设计——体育兵乓球5页面HTML+CSS+JavaScript

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

ES运维常用指令,常用的故障诊断指令,es集群健康状况、集群节点分配信息、分片分配信息、分片未分配问题诊断、集群开启密码访问

目录 查询集群的健康状况 查看集群中所有节点的分配信息 查询集群/索引的文档总计数 查询集群的分片分配信息 查询集群中索引的分片数、文档数或集群中包含哪些索引 查询集群的快照存储信息 查看集群状态信息 查看集群统计信息 查看集群中所有节点的节点属性 查询分片…

javaScript 进阶之路 --- 《手写“回调地狱”》

前言: 可能初次看到这个标题,你会有些惊讶。我们不是要实现“手写 Promise ”吗?怎么变成了手写“回调地狱”了?“我老早看视频学习的时候就知道,我们要避免写成“回调地狱的格式,怎么到你这还要手写这玩意…

论文投稿指南——中国(中文EI)期刊推荐(第5期)

🚀 EI是国际知名三大检索系统之一,在学术界的知名度和认可度仅次于SCI!🎄🎈 【前言】 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊。其中&#xf…

智能优化算法:蜣螂优化算法-附代码

智能优化算法:蜣螂优化算法 摘要:蜣螂优化算法( Dung beetle optimizer, DBO), 是由 Jiankai Xue 等于2022 年提出的一种群体智能优化算法。其灵感来源于蜣螂的生物行为过程,具有寻优能力强,收敛速度快的特点。 1.蜣螂优化算法 …

一款很火的智能化 Shell 工具多色彩优化命令显示结果可以替换系统默认的 Shell 工具,支持多平台免费开源使用

一款很火的智能化 Shell 工具多色彩优化命令显示结果可以替换系统默认的 Shell 工具,支持多平台免费开源使用。 Nushell,它是用Rust写的,安全性提高的同时,Bug率也降低了,NuShell 专注于实现以下目标: 1、…

【云原生】Prometheus AlertManager讲解与实战操作

文章目录一、概述二、AlertManager 架构三、AlertManager 部署1)下载2)配置3)启动服务4)与Prometheus集成四、在Prometheus中设置告警规则五、AlertManager 告警通道配置一、概述 Prometheus 包含一个报警模块,就是我们…

利用图文和代码深度解析操作系统OS的内存管理实现原理机制和算法

利用图文和代码深度解析操作系统OS的内存管理实现原理机制和算法。 内存作为计算机系统的组成部分,跟开发人员的日常开发活动有着密切的联系,我们平时遇到的Segment Fault、OutOfMemory、Memory Leak、GC等都与它有关。本文所说的内存,指的是计算机系统中的主存(Main Memo…