最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 異常的詳細介紹

 更新時間:2017年09月09日 11:43:44   投稿:lqh  
這篇文章主要介紹了C++ 異常的詳細介紹的相關資料,希望通過本文大家能夠掌握C++異常的使用方法,需要的朋友可以參考下

C++ 異常的詳解

程序有時會遇到運行階段錯誤,導致程序無法正常執(zhí)行下去。c++異常為處理這種情況提供了一種功能強大的而靈活的工具。異常是相對比較新的C++功能,有些老編譯器可能沒有實現(xiàn)。另外,有些編譯器默認關閉這種特性,我們可能需要使用編譯器選項來啟用它。

一、異常機制的使用

異常提供了將控制程序的一個部分傳遞到另一部分的途徑。對異常的處理有3個組成部分:

引發(fā)異常
使用處理程序捕獲異常
使用try塊

示例代碼:

#include "stdafx.h"
#include <iostream>
double hmean(double a, double b);
int main()
{
  double x, y, z;
  std::cout << "Enter two numbers: ";
  while (std::cin >> x >> y) {
    try
    {
      z = hmean(x, y);
    }
    catch(const char *s ){
      std::cout << s << std::endl;
      std::cout << " Enter a new pair of numbers: ";
      continue;
    }
    std::cout << "Harmonic mean of " << x << " and " << y << " is " << z << std::endl;
    std::cout << "Enter next set of numbers <q to quit>: ";
  }
  std::cout << "Bye! \n";
  system("pause");
  return 0;
}

double hmean(double a, double b) {
  if (a == -b) {
    throw "bad hmean() arguments a= -b not allowed";

  }
  return 2.0 *a*b / (a + b);
}

Enter two numbers: 3 6
Harmonic mean of 3 and 6 is 4
Enter next set of numbers <q to quit>: 10 -10
bad hmean() arguments a= -b not allowed
 Enter a new pair of numbers: q
Bye!
請按任意鍵繼續(xù). . .

程序說明:

try塊:

   try
    {
      z = hmean(x, y);
    }

引發(fā)異常的代碼:

if (a == -b) {
    throw "bad hmean() arguments a= -b not allowed";

  }

執(zhí)行throw語句類似于執(zhí)行返回語句,因為他也將終止函數(shù)的執(zhí)行;但throw不是講控制權返回給調用程序,而是導致程序沿函數(shù)調用序列后退,知道找到包含try塊的函數(shù)。

處理程序(或catch塊):

catch(const char *s ){
      std::cout << s << std::endl;
      std::cout << " Enter a new pair of numbers: ";
      continue;
    }

二、將對象用作異常類型

通常,引發(fā)異常的函數(shù)將傳遞一個對象。這樣做的重要優(yōu)點之一是,可以使用不同的異常類型來區(qū)分不同的函數(shù)在不同情況下引發(fā)的異常。另外,對象可以攜帶信息,程序員可以根據(jù)這些信息來確定引發(fā)異常的原因。同時,catch塊可以根據(jù)這些信息來決定采取什么樣的措施。

示例:

exc_mean.h

#include "stdafx.h"
#include <iostream>

class bad_hmean
{
private:
  double v1;
  double v2;
public :
  bad_hmean(double a = 0, double b = 0) :v1(a), v2(b) {}
  void mesg();
};
inline void bad_hmean::mesg() 
{
  std::cout << "hmean ( " << v1 << " ," << v2 << ") ;"
    << "invalid argumnents: a =-b \n";
}

class bad_gmean
{
public :
  double v1;
  double v2;
  bad_gmean(double a = 0, double b = 0) :v1(a), v2(b) {}
  const char * mesg();
};
inline const char* bad_gmean::mesg() {
  return "gmean() arguments shoud be >=0 \n";
}

測試代碼:

#include "stdafx.h"
#include <iostream>
#include <cmath>
#include "exc_mean.h"

double hmean(double a, double b);
double gmean(double a, double b);

int main()
{
  using std::cout;
  using std::cin;
  using std::endl;

  double x, y, z;
  1 >> 2;
  cout << "Enter two numbers ";
  while (cin >> x >> y)
  {
    try 
    {
      z = hmean(x, y);
      cout << "Harmonic mean of " << x << " and " << y << " is " << z << endl;
      cout << " Geometric mean of " << x << " and " << y << " is " << gmean(x, y) << endl;
      cout << " Enter next set of numbers <q to quit >:";
    }
    catch (bad_hmean & bg)
    {
      bg.mesg();
      cout << "Try again. \n";
      continue;
    }
    catch (bad_gmean & hg)
    {
      cout << hg.mesg();
      cout << "Value used: " << hg.v1 << " ," << hg.v2 << endl;
      cout << "Sorry, you don't get to play any more .\n ";
      break;
    }

  }
  cout << " Bye! \n";
  system("pause");
  return 0;
  return 0;
}

double hmean(double a, double b) {
  if (a == -b)
    throw bad_hmean(a, b);
  return 2.0 * a*b / (a + b);
}
double gmean(double a, double b) {
  if (a < 0 || b < 0) throw bad_gmean(a, b);
  return std::sqrt(a * b);
}

輸出結果:
Enter two numbers 4 12
Harmonic mean of 4 and 12 is 6
 Geometric mean of 4 and 12 is 6.9282
 Enter next set of numbers <q to quit >:5 -5
hmean ( 5 ,-5) ;invalid argumnents: a =-b
Try again.
5 -2
Harmonic mean of 5 and -2 is -6.66667
gmean() arguments shoud be >=0
Value used: 5 ,-2
Sorry, you don't get to play any more .
 Bye!
請按任意鍵繼續(xù). . .

三、異常規(guī)范

異常規(guī)范是C++98的一項功能,但c++11將其摒棄了。這意味著c++11仍然處于標準之中,但以后可能會從標準中剔除,因此不建議使用它。

異常規(guī)范示例:

double harm(double a ) throw(bad_thing);//可能會拋出 bad_thing異常
double marm(double ) throw() ;//不拋出異常

異常規(guī)范的作用:

1、告訴用戶可能需要使用try塊,然而這項功能也可使用注釋輕松完成。

2、讓編譯器添加執(zhí)行運行階段檢查代碼,檢查是否違反了異常規(guī)范,然而這很難檢查,例如marm可能不會引發(fā)異常,但它可能調用一個函數(shù),而這個函數(shù)調用另一個函數(shù)引發(fā)了異常

總之最好不要使用這項功能,c++11也建議忽略異常規(guī)范

然而c++11確實支持一種特殊的異常規(guī)范,可使用關鍵字noexcept

例如

double marm() noexcept;

四、棧解退

假設函數(shù)由于異常(而不是由于返回)而終止,則程序也將釋放棧中的內存,但不會師范棧的第一個返回地址后停止,而是繼續(xù)釋放棧,直到找到一個位于Try塊的返回地址。隨后,控制權將轉到塊尾的異常處理程序,而不是函數(shù)調用后面的第一條語句。這個過程叫做棧解退。

五、exception類

較新的C++編譯器將異常合并到語言中,例如,為支持該語言,exception頭文件(以前為exception.h 或except.h)定義了 exception類,c++可以把它用作其他異常類的基類。

頭文件 exceptionhe 和 stdexcept 定義了一些常用的異常類

有:logic_error、runtime_error、domain_error 等

六、意外異常與未捕獲異常處理

異常引發(fā)后,在兩種情況下,會導致問題。首先,如果它是在帶異常規(guī)范的函數(shù)中引發(fā)的,則必須與規(guī)范列表的某種異常匹配(在繼承層次機構中,類類型與這個類與其派生的對象匹配),否則成為意外異常。在默認情況下,這將導致程序異常終止(雖然C++11摒棄了異常規(guī)范,但仍支持它,且有些現(xiàn)有代碼使用了它)如果異常不是在函數(shù)中引發(fā)的(或者函數(shù)沒有異常規(guī)范),則必須捕獲它,如果沒有捕獲(在沒有try塊或沒有匹配的catch塊時,將出現(xiàn)這種情況),則異常被稱未捕獲異常。這將導致程序異常終止。然而可以修改程序對意外異常和為捕獲異常的反應。

未捕獲異常:

未捕獲異常不會導致程序立即異常中終止,相反,程序將首先調用函數(shù)terminate()。在默認情況下terminate()調用abort()函數(shù)??梢灾付╰erminate()應調用的函數(shù)(而不是abort())來修改terminate()的這種行為。為此,可調用set_terminate()函數(shù)。set_terminate()和terminate()都是在頭文件exception中聲明的:

typedef void (*terminate_handle)() ;
terminate_handle set_terminate(terminate_handle f) throw();//c++ 98
terminate_handle set_terinate(terminate_handle f) noexcept; //c++11
void teminate(); //c++98
void teminate() noexcept ; //c++11

示例:

void myQuit()
{
  std::cout << "Terminating due to uncaught exception \n";

  system("pause");
}

在程序開始時執(zhí)行:
set_terminate(myQuit);

意外異常

如果發(fā)生意外異常,程序將調用unexcepted()函數(shù),這個函數(shù)將調用teminate(),后者默認滴啊用abort()。和set_terminate()函數(shù)一樣,也有一個可用于修改unexcepted()的行為的set_unexpeceted()函數(shù)。這些函數(shù)也是在頭文件exception中聲明的:

typedef void (* unexpected_handle)();
unexpected_handle set_unexpected(unexpected_handle f) throw();//c++98
unexpected_handle set_unexpected(unexpected_handle f) noexpect;//c++11
void unexpected(); c++ 98
void unexpected() noexcept ;//c+ 0x

使用如下:

void myUnexpected() {
  throw std::bad_exception(); // or just throw ;
}
在程序開始時:
set_unexpected(myUnexpected);

我在vs 2015下測試,并未實現(xiàn)這種功能,必須顯示調用terminate() 和 unexpected();

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • 詳解C++賦值操作符重載

    詳解C++賦值操作符重載

    這篇文章主要介紹了C++賦值操作符重載的相關資料,幫助大家更好的理解和學習c++,感興趣的朋友可以了解下
    2020-08-08
  • 基于C++實現(xiàn)酒店管理系統(tǒng)

    基于C++實現(xiàn)酒店管理系統(tǒng)

    這篇文章主要為大家詳細介紹了基于C++實現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言利用鏈表與文件實現(xiàn)登錄注冊功能

    C語言利用鏈表與文件實現(xiàn)登錄注冊功能

    這篇文章主要介紹了C語言利用鏈表與文件實現(xiàn)登錄注冊功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++面試題之結構體內存對齊計算問題總結大全

    C++面試題之結構體內存對齊計算問題總結大全

    這篇文章主要給大家總結了關于C++面試題中結構體內存對齊計算問題的相關資料,文中通過示例代碼介紹的非常詳細,通過這些介紹的內容對大家在面試C++工作的時候,會有一定的參考幫助,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-08-08
  • C++?const與constexpr區(qū)別小結

    C++?const與constexpr區(qū)別小結

    C++11標準中,const用于為修飾的變量添加只讀屬性,而constexpr關鍵字則用于指明其后是一個常量,本文主要介紹了C++?const與constexpr區(qū)別小結,感興趣的可以了解一下
    2024-03-03
  • C++基于隨機數(shù)實現(xiàn)福彩雙色球的方法示例

    C++基于隨機數(shù)實現(xiàn)福彩雙色球的方法示例

    這篇文章主要介紹了C++基于隨機數(shù)實現(xiàn)福彩雙色球的方法,結合完整實例形式分析了C++隨機數(shù)算法的實現(xiàn)與使用技巧,需要的朋友可以參考下
    2017-06-06
  • C/C++解析文件名和目錄路徑的方法

    C/C++解析文件名和目錄路徑的方法

    #include <libgen.h> 是一個 C/C++ 語言的頭文件,主要用于字符串處理,特別是在處理文件路徑時,它提供了一些函數(shù)來幫助你解析文件名和目錄路徑,本文就給大家介紹一下C/C++解析文件名和目錄路徑的方法,需要的朋友可以參考下
    2024-10-10
  • C++淺析虛函數(shù)使用方法

    C++淺析虛函數(shù)使用方法

    對C++了解的人都應該知道虛函數(shù)(Virtual Function)是通過一張?zhí)摵瘮?shù)表(Virtual Table)來實現(xiàn)的。簡稱為V-Table。本文就將詳細講講虛函數(shù)表的原理與使用,需要的可以參考一下
    2022-08-08
  • C++中使用mutable關鍵字的場景分析

    C++中使用mutable關鍵字的場景分析

    C++中的mutable關鍵字用于修飾類的成員變量,使其在const成員函數(shù)中可以被修改,它主要用于緩存、線程同步和調試等場景,以支持對象的邏輯常量性,在使用mutable時,應確保其修改不會破壞對象的外部表現(xiàn)狀態(tài),本文介紹C++中使用mutable關鍵字的場景分析,感興趣的朋友一起看看吧
    2025-02-02
  • C++設計模式之觀察者模式

    C++設計模式之觀察者模式

    這篇文章主要介紹了C++設計模式之觀察者模式,本文講解了什么是觀察者模式、觀察者模式的UML類圖、觀察者模式的使用場合等內容,需要的朋友可以參考下
    2014-10-10

最新評論

彭水| 锡林浩特市| 花莲县| 璧山县| 宁南县| 莒南县| 焉耆| 庆安县| 瓮安县| 墨玉县| 白水县| 鲁山县| 扎赉特旗| 荔浦县| 澳门| 周至县| 玉环县| 井陉县| 明溪县| 清水河县| 聊城市| 徐州市| 汶上县| 河北区| 陇川县| 喀什市| 宜川县| 义马市| 宝鸡市| 宜都市| 黄龙县| 绥滨县| 南召县| 浪卡子县| 屏东县| 平江县| 抚州市| 荆州市| 华亭县| 武川县| 南部县|