Scala中if else结合异常处理时非法参数未触发异常问题排查
代码错误说明
你的代码存在5个核心问题,导致非法参数传入时无法触发预期逻辑:
- 条件判断逻辑恒真:判断条件
option != "AB" || option != "BC"|| option != "CD"永远成立。对任意输入值,它必然不满足至少两个不等判断,或逻辑下整个条件永远为true,完全起不到非法值拦截的判断作用。 - 执行顺序颠倒:你把取参数的
dbutils.widgets.get("option")操作放在了if判断内部,等于先做参数合法性判断,再去读取参数,逻辑顺序完全错误。 - 变量作用域错误:try块内用
var option定义的是块级局部变量,catch块中引用的option是外层作用域的变量,根本拿不到try块里读取到的参数值。 - 异常触发逻辑错误:
dbutils.widgets.get仅在对应widget不存在时才会抛出异常,当widget存在但传入的参数值非法(比如"XY")时,方法会正常返回字符串,不会主动抛异常,自然不会走到catch分支。参数取值合法性是业务校验规则,需要你手动判断后主动抛出异常,不能依赖组件自身的异常。 - 额外小问题:提示信息存在拼写错误,
shoud应为should,following用词不符合英文表达习惯。
修正后代码
正确的执行逻辑是先读取参数,再做合法性校验,非法值主动抛出异常统一捕获处理,参考代码如下:
// 预定义合法参数取值集合 val validOptionSet = Set("AB", "BC", "CD") try { // 第一步:读取widget参数 val currentOption = dbutils.widgets.get("option") // 第二步:校验参数合法性,非法值主动抛出异常 if (!validOptionSet.contains(currentOption)) { throw new IllegalArgumentException(s"Input option value is $currentOption") } // 校验通过后,在这里编写后续业务处理逻辑 println(s"Process with valid option: $currentOption") } catch { case e: Exception => println(s"Parameter check failed, the option should be one of AB, BC or CD. Error info: ${e.getMessage}") }
修正后无论是widget不存在,还是传入的参数值不在AB/BC/CD范围内,都会走到catch分支输出预期提示。
内容的提问来源于stack exchange,提问作者user3418170
相关产品推荐
相关产品推荐

