Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常规范,是否有用?_Java_C++_Exception_Exception Safety_Exception Specification - Fatal编程技术网

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
也可能是意外的、致命的结果


C++,C++的异常规范的主要区别在于java,规范是函数类型的一部分,编译器强制您不能允许已检查异常转义函数,除非它们是函数类型的一部分

因此,Java检查异常提供了一种有限/有缺陷的方法来跟踪哪些函数抛出了哪些异常。C++异常规范提供了一种限制/有缺陷的方法,防止调用函数抛出特定异常(或任何异常)。
由于它们有不同的目的,因此必须分别评估它们的成功或失败。就实际程序员避免使用它们的程度而言,我认为您可以放心地说它们都有点失败,但这就是您可以用同样的方式对两者进行评估的全部内容。对于java来说,这个程度相当高,C++非常高。他们所使用的有益用法,因此每个语言的成功程度都是不同的。

< P>爪哇和C++中的异常规范工作方式截然不同。p> <>这是C++的一个很好的信息来源。 < C++设计的主要缺点是,如果你抛出一个意外的异常,你的程序很可能崩溃(参见细节的链接)。因此,异常规范是一个约束,它将应用得太晚

Herb Sutter在文章结尾说:

java异常规范框架不同,您有两种类型的异常:检查(编译时)和运行时异常(非常类似C++,没有例外规范)。 对于选中的异常,编译器将强制开发人员处理这些异常,否则应用程序将无法编译。这是好的和有用的,但是运行时和检查异常之间的区别并不完全清楚,这取决于开发人员,它可能会产生混淆。此外,即使使用简单的程序习惯用法(例如),选中的异常也涉及到困难的决策

最终的结果是,像往常一样,由于没有明确的语言特征,它被错误地使用了。例如,C#设计师决定放弃它们


我认为,在这个特定的主题上,java设计比C++03更好(我是C++的超级粉丝),因为它允许开发人员以更具描述性的方式编写更好的代码。但是,您需要花费精力(编码标准和代码审查)在您的开发团队中生成一致的代码。

C++和Java在异常规范方面甚至没有可比性,因为它们在异常方面有所不同:

  • C++仅在需要时使用动态分配,程序员尽可能多地使用堆栈分配(如果只是为了避免释放内存的问题)
  • Java几乎一直使用动态分配;对于用户定义类型的对象,对于数组(甚至是编译时已知大小的数组)
在C++中,许多函数可以保证不会抛出任何异常。我不是在谈论异常规范,而是关于函数的记录和实际行为。对于简单函数调用的情况,只要没有可以引发异常的语句,异常规范是什么并不重要

[对于从不抛出异常的函数,当调用需要测量函数异常的调用代码的调用代码时,异常规范才是重要的,以便调用中间非抛出函数,如果中间存在异常,则会使对象处于坏状态。在现代C++中,在旧C++中,这可以用更冗长的方式(也就是库之间不兼容)来完成。 [注意:编译器始终有权查看编译期间可见的函数体,以确定是否可以抛出异常,并相应地优化调用代码(如果至少是为了减少异常表的大小)。抛出规范仅在编译器看不到代码无法抛出时才有帮助。]

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.