代码使用fastOptJS运行,但在Scala.js中使用fullOptJS失败

时间:2018-03-27 06:05:44

标签: scala.js

我在我的代码中捕获了由坏asInstanceOf抛出的UndefinedBehaviorError,如下所示:

$("button").on(
  "click",
  ".showDialog",
  (event: JQueryEventObject) => {
    event.preventDefault()
    val helpText = "Enter any number"
    js.Dynamic.global.swal(
      JC(
        title = helpText,
        text = helpText,
        `type` = "input",
        showCancelButton = true,
        closeOnConfirm = false,
        inputPlaceholder = helpText
      ),
      (input: Any) => {
        try {
          input.asInstanceOf[Boolean]
        } catch {
          case _: Throwable =>
            try {
              val correctInput = input.asInstanceOf[String].toDouble
              global.console.log("success")
            } catch {
              case _: Throwable =>
                js.Dynamic.global.swal.showInputError("Incorrect data!")
            }
        }
      }
    )
  }
)

使用fastOptJS可以正常工作但是使用fullOptJS会失败。如何正确地重写此代码以使用fullOptJS运行它或者其他选项是什么?

1 个答案:

答案 0 :(得分:1)

在Scala.js中,与Scala / JVM不同,错误的强制转换不能可靠地抛出ClassCastException。相反,错误的演员是未定义的行为,如指定的here。这意味着在fullOpt中,程序可以任意行为,特别是不允许抛出。但是,在fastOpt中,编译器是善良且可靠的抛出,但 a ClassCastException(因为它会给出错误的安全感),而不是{{1} }。

UndefinedBehaviorError必须永远不会被抓住,因为抓住一个隐藏了在fullOpt中浮出水面的错误。这是您的错误:您正在追踪UndefinedBehaviorError下的UndefinedBehaviorError。请注意catching Throwable is bad practice in Scala。相反,您应该使用case _: Throwable =>case scala.util.control.NonFatal(_) =>处理程序捕获NonFatal,因此不会隐藏错误。

现在解决您的问题,您根本不使用UndefinedBehaviorError作为进行类型测试的方法。即使在Scala / JVM上,该代码也是非常糟糕的做法。改为使用模式匹配:

asInstanceOf