我在我的代码中捕获了由坏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运行它或者其他选项是什么?
答案 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