Answers:
暂时让我们进入堆栈溢出-Java异常有多慢?
事实证明,抛出异常的昂贵部分是与异常一起发生的堆栈跟踪的填充。
当调试问题以尝试找出从何处调用时,此堆栈跟踪非常有用。问题的标准问题之一是“什么是代码”和“什么是堆栈跟踪”。没有这两件事,诊断问题几乎是不可能的。
但是,并非所有异常都是由问题产生的。您几乎可以期望其中的一些。
考虑一下您从某个来源获得String的情况,并且您想使用Integer.decode将其返回为整数格式。
Integer foo = Integer.decode(str);
但这decode
引发了检查NumberFormatException
。好...
Integer foo;
try {
foo = Integer.decode(str);
} catch (NumberFromatException e) {
// raise an error back to the input form
}
但是您真的不在乎那里的堆栈跟踪...而是那里的堆栈跟踪。而且速度稍慢一点,因为它填充了堆栈跟踪。
因此,在Scala中,您有NoStackTrace
:
由于效率原因,异常的特征不会填充堆栈跟踪。可以通过scala.sys.SystemProperties中的系统属性包装程序在全局范围内禁用堆栈跟踪抑制。
不要填充不需要的东西。您不必在乎堆栈跟踪,因为您要在那儿立即处理它。这不是被遗忘的东西,也不是所有例外。
当您知道要处理的内容时,使用它不是坏习惯。但是,如果您要在链上传递它-不要使用它-您可能只需要记录一些异常的来源即可。