【问题标题】:scala try/catch not catching some exceptionsscala try/catch 没有捕捉到一些异常
【发布时间】:2013-04-20 07:00:23
【问题描述】:

除非 try/catch 不起作用,我认为它应该起作用,否则我希望捕获以下异常。相反,它只是抛出 NPE。

try {
  scala.io.Source.fromInputStream(null)
} catch {
  case e:Throwable => println("oh cr*p!")
}

相比之下,下面的代码确实有效。

try {
  1/0
} catch {
  case e:Throwable => println("oh cr*p")
}

【问题讨论】:

    标签: scala exception-handling try-catch


    【解决方案1】:

    io.Source 是惰性的,因此在需要之前不会评估其输入。因此异常不是在初始化时抛出,而是在第一次使用时抛出。这个例子表明:

    scala> class Foo(val x: io.Source)
    defined class Foo
    
    scala> new Foo(io.Source.fromInputStream(null))
    res2: Foo = Foo@1c79f780
    

    这里也不例外。但是,一旦您使用它(在这种情况下将其打印到控制台),它就会引发异常:

    scala> res2.x
    java.lang.NullPointerException
        at java.io.Reader.<init>(Reader.java:78)
        at java.io.InputStreamReader.<init>(InputStreamReader.java:129)
    

    还有一个小提示:不要捕获 throwable,因为这也会捕获像 StackOverflowErrorOutOfMemoryError 这样的东西,你不想被捕获。

    【讨论】:

    • 为什么我们不应该捕获像 StackOverflowError 这样的 throwable?
    • 因为堆栈溢出总是程序中的错误,而不是治疗症状,您应该消除原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多