Java 异常规范,是否有用?
第一个免责声明:这不是为了引起“语言战争”。我真的需要这个(关于这个问题的澄清)作为我的报告,我只想有有效和可靠的论据。Java 异常规范,是否有用?,java,c++,exception,exception-safety,exception-specification,Java,C++,Exception,Exception Safety,Exception Specification,第一个免责声明:这不是为了引起“语言战争”。我真的需要这个(关于这个问题的澄清)作为我的报告,我只想有有效和可靠的论据。 好的,问题是: 在C++中,异常规范已经从C++ 11标准中删除,因为它被认为是造成伤害大于好处。 另一方面,在Java中,异常规范被视为是好的、有用的东西。 这两种语言中的这两个概念(产生异常规范的目的)不同吗?这就是为什么这两个社区对它们的看法不同,或者这两个概念相似/相同的原因? 是哪一个?异常规范是好事还是坏事?还是因为Java(Java语言)在Java中很好,(在这
好的,问题是:
在C++中,异常规范已经从C++ 11标准中删除,因为它被认为是造成伤害大于好处。 另一方面,在Java中,异常规范被视为是好的、有用的东西。
这两种语言中的这两个概念(产生异常规范的目的)不同吗?这就是为什么这两个社区对它们的看法不同,或者这两个概念相似/相同的原因?
是哪一个?异常规范是好事还是坏事?还是因为Java(Java语言)在Java中很好,(在这里我想看到一些原因),而C++中的(java)是很差的。
感谢所有提供建设性帮助的人。多年前,Java的检查异常已经不受欢迎,因为正如您所说,它们造成的伤害大于帮助。如今,人们主要设计如何避免它们的方法,通常是用
RuntimeException
s包装
在有效的Java中,Josh Bloch仍然在“异常但预期的结果”的情况下为检查过的异常辩护,但事实是,API编写者不是决定哪些结果是预期的,哪些不是的人。例如,在上下文中,即使是FileNotFoundException
也可能是意外的、致命的结果
由于它们有不同的目的,因此必须分别评估它们的成功或失败。就实际程序员避免使用它们的程度而言,我认为您可以放心地说它们都有点失败,但这就是您可以用同样的方式对两者进行评估的全部内容。对于java来说,这个程度相当高,C++非常高。他们所使用的有益用法,因此每个语言的成功程度都是不同的。 < P>爪哇和C++中的异常规范工作方式截然不同。p> <>这是C++的一个很好的信息来源。 < C++设计的主要缺点是,如果你抛出一个意外的异常,你的程序很可能崩溃(参见细节的链接)。因此,异常规范是一个约束,它将应用得太晚 Herb Sutter在文章结尾说:
java异常规范框架不同,您有两种类型的异常:检查(编译时)和运行时异常(非常类似C++,没有例外规范)。 对于选中的异常,编译器将强制开发人员处理这些异常,否则应用程序将无法编译。这是好的和有用的,但是运行时和检查异常之间的区别并不完全清楚,这取决于开发人员,它可能会产生混淆。此外,即使使用简单的程序习惯用法(例如),选中的异常也涉及到困难的决策
最终的结果是,像往常一样,由于没有明确的语言特征,它被错误地使用了。例如,C#设计师决定放弃它们我认为,在这个特定的主题上,java设计比C++03更好(我是C++的超级粉丝),因为它允许开发人员以更具描述性的方式编写更好的代码。但是,您需要花费精力(编码标准和代码审查)在您的开发团队中生成一致的代码。C++和Java在异常规范方面甚至没有可比性,因为它们在异常方面有所不同:
- C++仅在需要时使用动态分配,程序员尽可能多地使用堆栈分配(如果只是为了避免释放内存的问题)
- Java几乎一直使用动态分配;对于用户定义类型的对象,对于数组(甚至是编译时已知大小的数组)
C++中,“永不抛出”的要求可以被文档化,并由编译器强制执行,并带有空的抛出说明(无论是好的旧代码>(或)代码>还是现代<代码>
Moral #1: Never write an exception specification.
Moral #2: Except possibly an empty one, but if I were you I’d avoid even that.