在Scala中使用NoStackTrace是一种好习惯吗?


11

NoStackTrace在scala中遇到了mixin for Exceptions。

使用它是一种好习惯,还是应该将其视为Scala的“内部”工具并单独使用?

Answers:


14

暂时让我们进入堆栈溢出-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中的系统属性包装程序在全局范围内禁用堆栈跟踪抑制。

不要填充不需要的东西。您不必在乎堆栈跟踪,因为您要在那儿立即处理它。这不是被遗忘的东西,也不是所有例外。

当您知道要处理的内容时,使用它不是坏习惯。但是,如果您要在链上传递它-不要使用它-您可能只需要记录一些异常的来源即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.