栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么将exception.printStackTrace()视为不良做法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么将exception.printStackTrace()视为不良做法?

Throwable.printStackTrace()
将堆栈跟踪写入
System.errPrintStream
System.err
可以通过以下方式重定向JVM流程的流和基础标准“错误”输出流:

  • 调用
    System.setErr()
    会更改所指向的目的地
    System.err
  • 或通过重定向流程的错误输出流。错误输出流可以重定向到文件/设备
  • 人员可能会忽略其内容,
  • 文件/设备可能无法进行日志轮换,这意味着在归档文件/设备的现有内容之前,需要重新启动进程才能关闭打开的文件/设备句柄。
  • 或文件/设备实际上丢弃所有写入其中的数据,例如的情况

    /dev/null

    从以上推断,调用仅
    Throwable.printStackTrace()
    构成有效的(不好/很好的)异常处理行为

  • 如果你

    System.err
    在整个应用程序生命周期中都没有被重新分配,

  • 如果你在应用程序运行时不需要轮换日志,
  • 如果应用程序接受或设计了日志记录实践,则将写入
    System.err
    (以及JVM的标准错误输出流)。
    在大多数情况下,不满足上述条件。一个人可能不知道JVM中正在运行的其他代码,并且一个人无法预测日志文件的大小或进程的运行时间,因此,一种设计良好的日志记录实践将围绕编写“机器可解析的”日志文件(记录器中最好的但可选的功能),以帮助支持。

最后,应该记住,的输出

Throwable.printStackTrace()
肯定会与写入的其他内容交织在一起System.err(甚至
System.out
可能都被重定向到同一文件/设备)。这是一个必须处理的烦恼(对于单线程应用程序),因为在此类事件中不容易解析异常周围的数据。更糟糕的是,多线程应用程序很可能会生成非常混乱的日志,因为
Throwable.printStackTrace()
它不是线程安全的。

没有同步机制可以将堆栈跟踪的写入与

System.err多
个线程同时调用
Throwable.printStackTrace()
时的同步。要解决此问题,实际上需要你的代码在与之关联的监视器上进行同步
System.err(System.out
如果目标文件/设备相同,则还需要同步),这对于支付日志文件的完整性来说是一笔不小的代价。举个例子,
ConsoleHandlerand StreamHandler
类负责在
java.util.logging
; 提供的日志记录工具中将日志记录追加到控制台。发布日志记录的实际操作是同步的-尝试发布日志记录的每个线程也必须获得与该日志记录关联的监视器上的锁StreamHandler实例。如果希望使用
System.out/
保证具有非交错日志记录
System.err
,则必须确保相同-消息以可序列化的方式发布到这些流中。

考虑到以上所有内容以及在

Throwable.printStackTrace()
实际中非常有用的非常受限制的场景,通常会发现调用它是一种不好的做法。

扩展前面段落之一中的参数,将它

Throwable.printStackTrace
与写入控制台的记录器结合使用也是一个糟糕的选择。部分原因是由于记录器将在另一个监视器上进行同步,而你的应用程序(可能,如果你不想插入日志记录)将在另一个监视器上进行同步。当你在应用程序中使用两个写入相同目的地的不同记录器时,该参数也适用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/432058.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号