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

詳細分析C++ 異常處理

 更新時間:2020年06月22日 15:07:32   作者:菜鳥教程  
這篇文章主要介紹了C++ 異常處理的的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

異常是程序在執(zhí)行期間產(chǎn)生的問題。C++ 異常是指在程序運行時發(fā)生的特殊情況,比如嘗試除以零的操作。

異常提供了一種轉(zhuǎn)移程序控制權(quán)的方式。C++ 異常處理涉及到三個關(guān)鍵字:try、catch、throw。

  • throw: 當(dāng)問題出現(xiàn)時,程序會拋出一個異常。這是通過使用 throw 關(guān)鍵字來完成的。
  • catch: 在您想要處理問題的地方,通過異常處理程序捕獲異常。catch 關(guān)鍵字用于捕獲異常。
  • try: try 塊中的代碼標(biāo)識將被激活的特定異常。它后面通常跟著一個或多個 catch 塊。

如果有一個塊拋出一個異常,捕獲異常的方法會使用 try 和 catch 關(guān)鍵字。try 塊中放置可能拋出異常的代碼,try 塊中的代碼被稱為保護代碼。使用 try/catch 語句的語法如下所示:

try
{
  // 保護代碼
}catch( ExceptionName e1 )
{
  // catch 塊
}catch( ExceptionName e2 )
{
  // catch 塊
}catch( ExceptionName eN )
{
  // catch 塊
}

如果 try 塊在不同的情境下會拋出不同的異常,這個時候可以嘗試羅列多個 catch 語句,用于捕獲不同類型的異常。

拋出異常

您可以使用 throw 語句在代碼塊中的任何地方拋出異常。throw 語句的操作數(shù)可以是任意的表達式,表達式的結(jié)果的類型決定了拋出的異常的類型。

以下是嘗試除以零時拋出異常的實例:

double division(int a, int b)
{
  if( b == 0 )
  {
   throw "Division by zero condition!";
  }
  return (a/b);
}

捕獲異常

catch 塊跟在 try 塊后面,用于捕獲異常。您可以指定想要捕捉的異常類型,這是由 catch 關(guān)鍵字后的括號內(nèi)的異常聲明決定的。

try
{
  // 保護代碼
}catch( ExceptionName e )
{
 // 處理 ExceptionName 異常的代碼
}

上面的代碼會捕獲一個類型為 ExceptionName 的異常。如果您想讓 catch 塊能夠處理 try 塊拋出的任何類型的異常,則必須在異常聲明的括號內(nèi)使用省略號 ...,如下所示:

try
{
  // 保護代碼
}catch(...)
{
 // 能處理任何異常的代碼
}

下面是一個實例,拋出一個除以零的異常,并在 catch 塊中捕獲該異常。

實例

#include <iostream>
using namespace std;
 
double division(int a, int b)
{
  if( b == 0 )
  {
   throw "Division by zero condition!";
  }
  return (a/b);
}
 
int main ()
{
  int x = 50;
  int y = 0;
  double z = 0;
 
  try {
   z = division(x, y);
   cout << z << endl;
  }catch (const char* msg) {
   cerr << msg << endl;
  }
 
  return 0;
}

由于我們拋出了一個類型為 const char* 的異常,因此,當(dāng)捕獲該異常時,我們必須在 catch 塊中使用 const char*。當(dāng)上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結(jié)果:

Division by zero condition!

C++ 標(biāo)準(zhǔn)的異常

C++ 提供了一系列標(biāo)準(zhǔn)的異常,定義在 <exception> 中,我們可以在程序中使用這些標(biāo)準(zhǔn)的異常。它們是以父子類層次結(jié)構(gòu)組織起來的,如下所示:

下表是對上面層次結(jié)構(gòu)中出現(xiàn)的每個異常的說明:

異常 描述
std::exception 該異常是所有標(biāo)準(zhǔn) C++ 異常的父類。
std::bad_alloc 該異??梢酝ㄟ^ new 拋出。
std::bad_cast 該異常可以通過 dynamic_cast 拋出。
std::bad_exception 這在處理 C++ 程序中無法預(yù)期的異常時非常有用。
std::bad_typeid 該異??梢酝ㄟ^ typeid 拋出。
std::logic_error 理論上可以通過讀取代碼來檢測到的異常。
std::domain_error 當(dāng)使用了一個無效的數(shù)學(xué)域時,會拋出該異常。
std::invalid_argument 當(dāng)使用了無效的參數(shù)時,會拋出該異常。
std::length_error 當(dāng)創(chuàng)建了太長的 std::string 時,會拋出該異常。
std::out_of_range 該異常可以通過方法拋出,例如 std::vector 和 std::bitset<>::operator[]()。
std::runtime_error 理論上不可以通過讀取代碼來檢測到的異常。
std::overflow_error 當(dāng)發(fā)生數(shù)學(xué)上溢時,會拋出該異常。
std::range_error 當(dāng)嘗試存儲超出范圍的值時,會拋出該異常。
std::underflow_error 當(dāng)發(fā)生數(shù)學(xué)下溢時,會拋出該異常。

定義新的異常

您可以通過繼承和重載 exception 類來定義新的異常。下面的實例演示了如何使用 std::exception 類來實現(xiàn)自己的異常:

#include <iostream>
#include <exception>
using namespace std;
 
struct MyException : public exception
{
 const char * what () const throw ()
 {
  return "C++ Exception";
 }
};
 
int main()
{
 try
 {
  throw MyException();
 }
 catch(MyException& e)
 {
  std::cout << "MyException caught" << std::endl;
  std::cout << e.what() << std::endl;
 }
 catch(std::exception& e)
 {
  //其他的錯誤
 }
}

這將產(chǎn)生以下結(jié)果:

MyException caught
C++ Exception

在這里,what() 是異常類提供的一個公共方法,它已被所有子異常類重載。這將返回異常產(chǎn)生的原因。

以上就是詳細分析C++ 異常處理的詳細內(nèi)容,更多關(guān)于C++ 異常處理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入淺析C語言與C++的區(qū)別與聯(lián)系

    深入淺析C語言與C++的區(qū)別與聯(lián)系

    這篇文章主要為大家介紹了深入的分析了C語言與C++的區(qū)別與聯(lián)系,文中通過詳細的示例進行了對比,以便大家更容易的看懂理解,有需要的朋友可以借鑒參考下
    2021-11-11
  • Qt學(xué)習(xí)教程之對話框消失動畫效果

    Qt學(xué)習(xí)教程之對話框消失動畫效果

    這篇文章主要給大家介紹了關(guān)于Qt學(xué)習(xí)教程之對話框消失動畫效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 解析c++中參數(shù)對象與局部對象的析構(gòu)順序的詳解

    解析c++中參數(shù)對象與局部對象的析構(gòu)順序的詳解

    本篇文章是對c++中參數(shù)對象與局部對象的析構(gòu)順序進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++多線程實現(xiàn)電子詞典

    C++多線程實現(xiàn)電子詞典

    這篇文章主要為大家詳細介紹了C++多線程實現(xiàn)電子詞典,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C++求四個正整數(shù)最大公約數(shù)的方法

    C++求四個正整數(shù)最大公約數(shù)的方法

    這篇文章主要介紹了C++求四個正整數(shù)最大公約數(shù)的方法,涉及C++求余算法的運用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-05-05
  • C語言實現(xiàn)簡易網(wǎng)絡(luò)聊天室

    C語言實現(xiàn)簡易網(wǎng)絡(luò)聊天室

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡易網(wǎng)絡(luò)聊天室,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言基礎(chǔ)解析之分支與循環(huán)語句

    C語言基礎(chǔ)解析之分支與循環(huán)語句

    C語言是一門結(jié)構(gòu)化的程序設(shè)計語言,當(dāng)C語言用來描述生活中的事物時,會用到三種結(jié)構(gòu):順序結(jié)構(gòu)(不去贅述),選擇結(jié)構(gòu)(對應(yīng)分支語句),循環(huán)結(jié)構(gòu)(對應(yīng)循環(huán)語句),分支語句:分支語句分為兩種,一種是if語句,一種是switch語句
    2021-09-09
  • C++ deque容器的具體使用

    C++ deque容器的具體使用

    deque又稱雙端隊列容器。deque容器中存儲元素并不能保證所有元素都存儲到連續(xù)的內(nèi)存空間中,本文詳細的介紹了C++ deque容器的使用,感興趣的可以了解一下
    2021-05-05
  • c++ 深入理解歸并排序的用法

    c++ 深入理解歸并排序的用法

    歸并排序是典型分治思想的代表——首先把原問題分解為兩個或多個子問題,然后求解子問題的解,最后使用子問題的解來構(gòu)造出原問題的解
    2022-03-03
  • C/C++中命名空間(namespace)詳解及其作用介紹

    C/C++中命名空間(namespace)詳解及其作用介紹

    今天小編就為大家分享一篇關(guān)于C++命名空間namespace的介紹與使用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-09-09

最新評論

延庆县| 资兴市| 西乌珠穆沁旗| 东兰县| 广饶县| 全南县| 昭觉县| 谢通门县| 南召县| 南开区| 加查县| 济南市| 志丹县| 扶沟县| 拜城县| 合肥市| 禹城市| 武清区| 新沂市| 万载县| 阿坝县| 合作市| 武清区| 集贤县| 惠东县| 华宁县| 昔阳县| 奉新县| 景德镇市| 临沧市| 吴旗县| 大姚县| 类乌齐县| 青河县| 宜兰县| 拜城县| 桐梓县| 且末县| 陇南市| 海南省| 新密市|