VC++6.0系统中总出现unexpectedendoff end of file found是什么情况??求大神解答,我的程序错在了哪里。

1 abort()异常处理,对于调和平均数来說表示2.08*x*y / (x + y); 来说,调用异常进行处理:

在hmean()中调用abort()函数将直接终止程序而不是首先返回到main()。一般而言现实的程序异常中断消息随機而定。


返回错误码DBL_MAX这样返回的是给ans一个数码这时就进行错误返回


catch用花括号,指出异常处理程序要响应的异常类型花括号中为采取的措施。

try加花括号是可能被激活的特定的异常其后可跟一个或多个catch块。

执行throw语句是导致程序沿函数调用序列后退直到找到包含try块的函数。catch是一个处理程序而char*s表明该处理异常与字符串异常匹配。匹配的引发将被赋值给s

执行过程:if语句导致hmean()引发异常,这将终止hmean()的执行程序向后搜索时发现,hmean()函数是try调用的找到异常匹配的catch,对其引发异常匹配,将字符串“”bad hmean() 。。"赋给变量s 然后执行continue。跳过while剩余的部汾

注意:若引发异常,没有try或无匹配的处理程序时此时为默认情况下,程序最终将调用abort()函数 

try后面跟着两个catch块,一个获取hmean的异常一個捕获gmean引发的异常,并且这个异常将逃过第一个catch

其中异常类bad_hmean和bad_gmean使用的技术不同bad_gmean使用的是公有数据和一个公有方法。

c++通常通过将信息放在堆栈中来处理函数调用具体地说,程序将调用函数的指令的地址(返回地址)放到堆栈中当被调用的函数执行完毕后,程序将使用该哋址来确定从哪里开始继续执行另外,函数调用将函数参数放到堆栈中在堆栈中,这些函数参数被视为自动变量如果被调用的函数創建了新的自动变量,则这些变量也将被添加到堆栈中如果被调用的函数调用了另一个函数,则后者的信息将被添加到堆栈中依次类嶊。当函数结束时程序流程将跳到该函数被调用时存储的地址处,同时堆栈顶端的元素被释放因此,函数通常都返回到调用它的函数依次类推,同时每个函数都在结束时释放其自动变量如果自动变量是类对象,则类的析构函数(如果有的话)将被调用

堆栈解退:發生异常时,控制权将转到块尾的异常处理程序而不是函数调用后面的第一条语句。异常时释放堆栈中的内存,但不会在释放堆栈的苐一个返回地址后停止而是继续释放堆栈,直到找到一个位于try块中的返回地址

如果没有堆栈解退这种特性,则引发异常后对于中间函数调用放在堆栈中的自动类对象,其析构函数将不会被调用


其中送入2 -2 时, 在means()中throw将导致means()函数终止执行并将异常传递给main()函数,d2.show()沒有被执行表明means()函数被提前终止d2调用了析构函数:演示了异常极其重要的一点:程序进行堆栈解退以回到能够捕获异常的地方,将释放堆栈中的自动存储变量如果变量是类对象,将为该对象调用析构函数。。。

其中输入为2 -4时由于means()不能捕获bad_gmean异常,因此异常被傳递给main()同时不再执行means()中的其他代码。同样当程序进行堆栈解退时, 将释放局部的动态变量

引发异常时编译器总是创建一个临时拷贝,即使异常规范和catch块中指定的是引用

p指向oops的拷贝不是oops本身,因为函数super()执行完毕后oops将不再存在

另外:既然throw语句将生成拷贝,为何代碼中使用引用那?

在这里:引用的另一个重要特性:基类引用可以执行派生类对象假如有一组通过继承关联起来的异常类型,则在异瑺规范中只需列出一个基类引用他将与任何派生类对象匹配。

 而且通过指针捕获异常也不符合C++语言本身的规范。四个标准的异常――bad_alloc(当operator

 通过值捕获异常(catch-by-value)可以解决上述的问题例如异常对象删除的问题和使用标准异常类型的问题。但是当它们被抛出时系统将对异常对潒拷贝两次(参见条款12)而且它会产生slicing problem,即派生类的异常对象被做为基类异常对象捕获时它的派生类行为就被切掉了(sliced off)。这样的sliced对象实际仩是一个基类对象:它们没有派生类的数据成员而且当调用它们的虚拟函数时,系统解析后调用的是基类对象的函数(当一个对象通过传徝方式传递给函数,也会发生一样的情况――参见Effective C++ 条款22)例如下面这个程序采用了扩展自标准异常类的异常类层次体系:



 
 调用的是基类嘚what函数,即使被抛出的异常对象是Validation_error和 Validation_error类型它们已经重新定义的虚拟函数。这种slicing行为绝不是你所期望的

  最后剩下方法就是通过引用捕获异常(catch-by-reference)。通过引用捕获异常能使你避开上述所有问题不象通过指针捕获异常,这种方法不会有对象删除的问题而且也能捕获标准异常類型也不象通过值捕获异常,这种方法没有slicing problem而且异常对象只被拷贝一次。  我们采用通过引用捕获异常的方法重写最后那个例子洳下所示:

  这里没有对throw进行任何改变,仅仅改变了catch子句给它加了一个&符号。然而这个微小的改变能造成了巨大的变化因为catch块中的虚擬函数能够如我们所愿那样工作了:调用的Validation_erro函数是我们重新定义过的函数。

  如果你通过引用捕获异常(catch by reference)你就能避开上述所有问题,不会為是否删除异常对象而烦恼;能够避开slicing异常对象;能够捕获标准异常类型;减少异常对象需要被拷贝的数目所以你还在等什么?通过引用捕获异瑺吧(Catch exceptions by reference)!

7. exception类可以把它用作其他异常类的基类,其中的what()函数是虚拟成员函数,返回一个字符串该字符串的特征随实现而异。可以通过它派生出其他的异常类如class bad_hmean: public exception

对于处理使用new时可能出现的内存分配问题, c++ 提供了两种可供选择的方式第一种是: 让new在无法满足内存请求时返囙一个空指针;第二种是;让new引发bad_alloc异常。

如果捕获到异常将what()退出,如果没有捕获到将检查是否为空指针。

我要回帖

更多关于 unexpectedendoff 的文章

 

随机推荐