2

スカラ 2.10.2。ランニング

import util.continuations._
import concurrent.ops._

object Main {
    def main(args: Array[String]) {
        reset {
            try {
                shift { cont: (Unit => Unit) => {
                    spawn {
                        throw new Exception("blah")
                        cont()
                    }
                }}
                println("after shift")
            } catch {
                case e: Exception => println(e)
            }
            println("reset end")
        }
    }
}

与える

Cont.scala:16: error: type mismatch;
 found   : Unit
 required: Unit @scala.util.continuations.cpsParam[Unit,Unit]
                case e: Exception => println(e)
                                            ^
one error found

try/catch ブロックを削除すると、すべて問題ありません。Scalaで継続がどのように機能するかをまだ理解しようとしていますが、これは完全に私を逃れています。

4

2 に答える 2

0

try/catch ステートメントでキャッチするつもりException("blah")ですか?

コンパイルされたとしてもspawn、フローが継続を実行する前に、非推奨の別のスレッドで発生します。

try/catch がないと、次のようになります。

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() }2 つを実行するだけです。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()beforeを挿入する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
于 2013-07-18T04:36:11.300 に答える