所有异常都是c ++中的对象?

时间:2015-06-04 16:05:51

标签: c++ object exception

在某些文献中,如http://en.wikibooks.org/wiki/C%2B%2B_Programming/Exception_Handling,它们将所有异常视为对象,即使它们抛出基本类型或指针。

我想问为什么我们称它们为对象,如果有时它们不是对象。 如果我不理解,请纠正我。

2 个答案:

答案 0 :(得分:5)

好吧,您可以使用原语,例如const char*int来正确抛出并捕获异常

 try {
     if(bad_condition_one) {
         throw "Bad condition 1 was hit.";
     }
     else if(bad_condition_two) {
         throw 42;
     }
 }
 catch(const char* msg) {
     std::cerr << msg << std::endl;
 }
 catch(int code) {
     std::cerr << code << std::endl;
 }

但这样做肯定不是一个好主意。您应该首先使用从std::exception派生的异常值。并将它们作为const引用来捕获,如:

 try {
     if(bad_condition_one) {
         throw std::runtime_error("Bad condition 1 was hit.");
     }
 }
 catch(const std::exception& ex) {
     std::cerr << ex.what() << std::endl;
 }

请在您的问题中更正确地定义 对象 的概念(您的意思是classstruct还是union类型实际上?)。

答案 1 :(得分:5)

  

问:&#34;我想问为什么我们称它们为对象,如果有时它们不是   对象&#34;

任何占用记忆的东西都是一个对象。 面向对象的目的是通过将数据接受的操作与数据本身绑定,将焦点转移到数据(对象)。

显然,只有用户定义的类型允许您以编程方式执行此操作,但不会将基本类型作为对象停止。

根据C++11标准:

1.8 C ++对象模型[ intro.object ]

  

1 C ++程序中的构造创建,销毁,引用,访问,   并操纵对象。对象是存储区域。

这是维基百科所说的:

Object (computer science)

  

在计算机科学中,对象是存储器中具有值的位置   并且可能由标识符引用。对象可以是变量,   数据结构或函数。在基于类的面向对象中   编程范式,&#34;对象&#34;是指a的特定实例   class,其中对象可以是变量,函数的组合,   和数据结构。