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

詳細分析C++ 異常處理

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

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

異常提供了一種轉移程序控制權的方式。C++ 異常處理涉及到三個關鍵字:try、catch、throw。

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

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

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

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

拋出異常

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

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

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

捕獲異常

catch 塊跟在 try 塊后面,用于捕獲異常。您可以指定想要捕捉的異常類型,這是由 catch 關鍵字后的括號內(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* 的異常,因此,當捕獲該異常時,我們必須在 catch 塊中使用 const char*。當上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結果:

Division by zero condition!

C++ 標準的異常

C++ 提供了一系列標準的異常,定義在 <exception> 中,我們可以在程序中使用這些標準的異常。它們是以父子類層次結構組織起來的,如下所示:

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

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

定義新的異常

您可以通過繼承和重載 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)生以下結果:

MyException caught
C++ Exception

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

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

相關文章

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

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

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

    Qt學習教程之對話框消失動畫效果

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

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

    本篇文章是對c++中參數(shù)對象與局部對象的析構順序進行了詳細的分析介紹,需要的朋友參考下
    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)絡聊天室

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

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

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

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

    C++ deque容器的具體使用

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

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

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

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

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

最新評論

韶关市| 航空| 特克斯县| 西宁市| 屏南县| 余干县| 阿瓦提县| 松桃| 梁平县| 九寨沟县| 黎城县| 乌拉特中旗| 察隅县| 黔江区| 吉安市| 阳原县| 定安县| 明水县| 咸阳市| 屏南县| 潞城市| 鸡西市| 保山市| 如东县| 芜湖县| 清丰县| 册亨县| 丰镇市| 休宁县| 安阳县| 通辽市| 嘉定区| 宜阳县| 泗水县| 喀喇沁旗| 漳平市| 新民市| 古交市| 科尔| 博白县| 盱眙县|