Java异常的另类用法(一)

2023-05-16

    异常在我们的代码中是不可避免的,有些异常可以忽略,多数的异常我们要显式处理(至少要记录日志,以便后面排查问题),

这里我们不是要细说异常的处理规范,而是使用异常做个有趣的应用。

我们平时看到的异常日志类似以下的形式:


这个异常栈信息中有哪些有用的信息呢?

首先你会看到异常的类型(Error、Exception、RuntimeException。。。),异常的类名,发生异常的具体位置,异常错误消息等等。。。

这些都不细说了,我们现在关注的是异常栈中方法的调用层次结构,有些方法还指明了所在的代码行数,这个是一个不错的有用信息,所以我编写了以下的一个工具方法:

	public static void trace() {
		try {
			throw new RuntimeException("Trace:");
		} catch (RuntimeException ex) {
			printTrace(System.err, ex, 1);
		}
	}

trace方法顾名思义就是追踪代码方法的调用层次,这里面特意抛了一个RuntimeException,并捕获它,然后再打印异常栈信息,

这样我们就能获得形如上面异常日志的信息了。因为我们捕获了自己抛出的异常,所以不会影响后续代码的执行,这里我们只是为了打印方法调用信息。

printTrace方法的实现如下:

	/**
	 * @param s
	 * @param throwable
	 * @param beginIndex
	 */
	public static void printTrace(PrintStream s, Throwable throwable,
			int beginIndex) {
		synchronized (s) {
			s.println("Trace:");
			StackTraceElement[] trace = throwable.getStackTrace();
			for (int i = beginIndex; i < trace.length; i++)
				s.println("\t" + trace[i]);
		}
	}
这里我们先打印了一行Trace: (s.println("Trace:");),以区别于普通的异常,

那么这个东东有什么用呢?

如上面所说的,我们看清某个代码点执行的路径,当然你做debug时也可以,但debug比较耗时,特别对于复杂的代码,调用层次比较深时debug都是比较麻烦累人的。

这个也可以作为debug 的辅助,先看清执行路径方便我们在哪里打断点,或许你还可以发现其他不同的用处。

最后,看一个测试小程序:

public class TestExceptionUtils {

	static void fun1(boolean flag) {
		if (flag) {
			fun2(flag);
		} else {
			fun3(flag);
		}
	}

	static void fun2(boolean flag) {
		if (!flag) {
			fun4();
		} else {
			fun5();
		}
	}

	static void fun3(boolean flag) {
		if (flag) {
			fun6();
		} else {
			fun7();
		}
	}

	static void fun4() {
		ExceptionUtils.trace();
		System.out.println("execute fun 4.");
	}

	static void fun5() {
		ExceptionUtils.trace();
		System.out.println("execute fun 5.");
	}

	static void fun6() {
		ExceptionUtils.trace();
		System.out.println("execute fun 6.");
	}

	static void fun7() {
		ExceptionUtils.trace();
		System.out.println("execute fun 7.");
	}

	public static void main(String[] args) {
		fun1(true);
		fun1(false);
	}

}

在eclipse上运行的结果,控制台打印如下:



最后说一点:这个东西可能在某些人眼里真没啥用,但是请勿喷;因为我也是自娱自乐,平时练练手罢了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java异常的另类用法(一) 的相关文章

  • Arduino+蜂鸣器制作有趣的小音乐

    Arduino相关姿势 Arduino是一个开源的硬件平台 xff0c 包括开发套组 xff08 开发板和相关的模块以及连线 xff09 和IDE 开发语言基于C 核心是一块8位ATmega328的处理器 xff0c 这块处理器是AVR单片
  • 计算机图形学笔记

    前言 图形学还是相对比较重要的课程 xff0c 趁着刚刚学完简要记录一下 基本内容 基本几何元素及其表示 xff0c 点 线 面 环以及三维形体 一般的 xff0c 我们使用参数方程来表示一个几何元素 参数方程中未知数的个数为元素的维数 三
  • 深入理解Java中的String

    深入理解Java中的String 本篇转载自博客园 xff0c 原作者平凡希 xff0c 特此说明
  • 反爬虫

    反爬虫
  • 设计模式——生产消费者模式

    设计模式 生产消费者模式 生产者消费者问题是线程模型中的经典问题 xff1a 生产者和消费者在同一时间段内共用同一存储空间 xff0c 生产者向空间里生产数据 xff0c 而消费者取走数据 像图片下载加载的模型就可以参考这个模型 UML图
  • win10如何修改mac地址(亲测通过)

    1 查看现有的mac地址 步骤 xff1a 打开cmd界面 xff0c 输入ipconfig all按回车 如下图 xff0c 箭头所指即为当前mac地址 2 屏幕右下角右键点击网络图标 xff0c 见下图 打开网络和共享中心 xff0c
  • eclipse怎么恢复默认界面

    Eclipse里面将界面恢复到默认状态 xff1a 1 选择Eclipse的工具栏里面的 窗口 xff08 Window xff09 xff0c xff08 Window Perspective Reset Perspective xff0
  • fatal: Authentication failed could not read from remote repository

    Git 无法clone pull fetch 异常 xff1a fatal could span class hljs operator not span span class hljs built in read span span cl
  • Mybatis Plus 自定义方法实现分页

    一般物理分页 xff0c 即通过sql语句分页 xff0c 都是在sql语句后面添加limit分页语句 xff0c 在xml文件里传入分页的参数 xff0c 再多配置一条sql xff0c 用于查询总数 xff1a lt select id
  • mac远程桌面Microsoft Remote Desktop for Mac - Mac-连接Windows远程桌面

    好记星不如烂笔头 xff0c 这里记录平时工作中用到的东西 xff0c 不喜可以留言 1 xff1a 在mac电脑远程桌面可以使用 xff0c Microsoft 远程桌面 使用 Microsoft Remote Desktop 这个还是很
  • 安装gentoo的点点滴滴(三)

    1 每次启动电脑都不能启动swap分区 xff0c 都要用swapon dev sdb3来激活交换分区 再去看gentoo的安装手册 xff0c 原来是 etc fstab没有编辑好 xff0c 使用其自动生成的有问题 现在将自己修改的贴上
  • keil5 串口打印的实现

    目的 xff1a 在keil5中实现串口打印 xff0c debug信号 方法 xff1a 首先安装串口调试工具 添加 include lt stdio h gt 重定向fputc函数 xff1a int fputc int ch FILE
  • 在Ubuntu中使用apt-get的时候,始终显示“E:无法定位软件包”

    可能的一个原因是因为安装过后没有更新软件源 xff0c 试试用 sudo apt get update 命令更新一下软件源
  • Linux安装nginx启动时出错:error while loading shared libraries: libpcre.so.0: cannot open shared object file

    启动linux的时候出现 xff1a error while loading shared libraries libpcre so 0 cannot open shared object file 解决方法 xff1a 1 cd lib6
  • Ubuntu 安装Chrome

    去官网下载安装包 google chrome stable current amd64 deb 地址 https www google com intl zh CN chrome browser sudo dpkg i google chr
  • redis集群搭建过程中踩过的几个坑

    这两天在玩redis的集群 xff0c 搭建过程中遇到了以下几个问题 首先是redis ERR Not all 16384 slots are covered by nodes 不是所有的slot都被分配了 xff0c 可以考虑使用redi
  • 业务分析系列主题:业务场景

    本文介绍了了业务场景的概念 要素以及创建方法 xff0c 与大家分享 xff01 业务场景作为一种需求分析技术用途十分广泛 本文涛哥就和大家聊聊业务场景是什么 xff0c 以及如何创建业务场景 一 业务场景是什么 xff1f 所谓 场景 x
  • 业务分析主题系列:常见的业务场景

    常见的业务场景 场景1 xff1a 数据涨跌异常如何处理 xff1f 场景2 xff1a 如何评估渠道质量 xff0c 确定投放优先级 xff1f 场景3 xff1a 一个功能 内容上线后 xff0c 如何评估其价值 xff1f 场景4 x
  • docker、firewalld和iptables之间的关系

    要注意docker命令中使用 p 暴露端口时 xff0c 实现需要依赖iptables CentOS 7默认使用的是firewalld 但是是否需要关闭firewalld并启动iptables呢 xff1f 参考多篇博文 xff0c 答案应
  • UBUNTU停留在登录界面一直循环但进不去的原因

    如标题所述 xff0c 这种情况一是动了 etc profile或者 etc environment文件 xff0c 改了里面的环境变量 xff0c 一是 Xauthority文件的所有权变成了root xff0c 导致普通用户无法进入桌面

随机推荐