加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 尝试阻止范围

发布时间:2020-12-16 09:31:23 所属栏目:安全 来源:网络整理
导读:我不满意一个try块中关于可变范围的规则,而不是与关联的catch和finally块共享。具体来说,它会导致如下代码: var v: VType = nulltry { v = new VType()}catch { case e = // handle VType constructor failure (can reference v)}finally { // can refere
我不满意一个try块中关于可变范围的规则,而不是与关联的catch和finally块共享。具体来说,它会导致如下代码:

var v: VType = null

try {
  v = new VType()
}
catch {
  case e => // handle VType constructor failure (can reference v)
}
finally {
  // can reference v.
}

相反:

try {
  val v = new VType()
}
catch {
  case e => // handle VType constructor failure (can reference v)
}
finally {
  // can reference v.
}

任何人都可以解释或证明为什么Java规则仍然存在?

和/或有希望这可能会改变吗?

谢谢!

UPDATE

非常感谢所有的答复。

这个共识似乎意味着“刚刚得到它”,我开始得出结论,也许在技术上我想要的是不健康,不值得努力或难以实现。

我喜欢Rex Kerr的答案,但是如何在方法调用中将原始代码包装在方法调用中,而不会在方法体中引入局部变量?

我自己的努力不是太好,使用by-name参数来延迟构建,直到try块工作安全,但仍然不允许我访问catch或finally块中的构造(或不)对象。

解决方法

你可能会想到这个问题的方式是错误的。为什么你想要这么多东西在你的try / catch / finally块?在你的代码中,

try { val v = new VType() }

在你得到v之前可能抛出异常,所以你不能安全地引用v。但是如果你不能引用v,那么你最后可以做什么,不会破坏或抛出自己的异常一些其他不明确的行为?如果你创建v但不能创建w,但是处理还需要w? (还是不?)最终会变成混乱

但是,如果你来自Java,有一些事情可以帮助你以合理的方式写入try / catch / finally块。

您可以做的一件事是捕获某些类别的异常,并将其转换为选项:

def s2a(s: String) = try { Some(s.toInt) } catch { case nfe: NumberFormatException => None}

您可以做的另一件事是创建自己的资源管理器

def enclosed[C <: { def close() }](c: C)(f: C => Unit) {
  try { f(c) } finally { c.close() }
}
enclosed(new FileInputStream(myFile))(fis => {
  fis.read...
}

或者您可以在另一种方法中创建自己的关闭和逃生安全方法:

val r = valuableOpenResource()
def attempt[F](f: => F) = {
  try { f } catch { case re: ReasonableException => r.close() throw re }
}
doSomethingSafe()
attempt( doSomethingDangerous() )
doSomethingElseSafe()
r.close()

在处理事物的这些不同方法之间,我没有太多的需要创建vars来容纳我以后要清理的变量,或以其他方式处理catch或finally块。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读