scala – 尝试阻止范围
我不满意一个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块。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |