Вы намерены использовать инструкцию try/catch для улова Exception("blah")
?
Даже если он скомпилирован, spawn
, который устарел, будет происходить в другом потоке, прежде чем поток начнет выполнение продолжения.
Без TRY/улова у вас есть что-то вроде этого:
println("in main " + Thread.currentThread())
reset {
shift { cont: (Unit => Unit) =>
{
spawn {
println("in spawned " + Thread.currentThread())
cont()
}
}
}
println("after shift " + Thread.currentThread())
println("reset end")
}
}
cont
функция является овеществленный часть кода, который соответствует этой функции:
val cont =() => {
println("after shift " + Thread.currentThread())
println("reset end")
}
Так когда вы делаете spawn { cont() }
, вы просто запускаете два println
в новой отдельной теме. Выполняя эту программу, я получаю:
in main Thread[main,5,main]
in spawned Thread[Thread-1,5,main]
after shift Thread[Thread-1,5,main]
reset end
Это показывает, что продолжение выполнялось по отдельной теме. Теперь, если вы вставляете throw new Exception()
до cont()
, тогда все, что вы получаете, является исключением, созданным на порожденной нити (где, по-видимому, исключение будет проглочено).
Будет ли продолжение продолжения внутри try/catch и исключение, возникшее после того, как shift
будет больше того, что вы пытаетесь сделать?
reset {
shift { cont: (Unit => Unit) =>
spawn {
println("in spawned " + Thread.currentThread())
try { cont() }
catch { case e: Exception => println(e) }
}
}
println("after shift " + Thread.currentThread())
throw new Exception("blah")
println("reset end")
}
}
Печатается:
in main Thread[main,5,main]
in spawned Thread[Thread-1,5,main]
after shift Thread[Thread-1,5,main]
java.lang.Exception: blah