栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

C++异常处理

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++异常处理

异常是程序在执行期间发生的问题。C++异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。异常提供了一种转移程序控制权的方式。C++异常处理涉及到三个关键字:try、catch、throw。

throw:当问题出现时,程序会抛出一个异常。这是通过使用throw关键字来完成的。

catch:在需要处理问题的地方,通过异常处理程序捕获异常,catch关键字用于捕获异常。

try:try块中的代码标识将被激活的特定异常,它后面通常跟着一个或多个catch块。

 如果一个块抛出一个异常,捕获异常会使用try和catch关键字,try块中放置可能抛出异常的代码,try块中的代码被称为保护代码。

try
{
   // 保护代码
}catch( ExceptionName e1 )
{
   // catch 块
}catch( ExceptionName e2 )
{
   // catch 块
}catch( ExceptionName eN )
{
   // catch 块
}

如果 try 块在不同的情境下会抛出不同的异常,这个时候可以尝试罗列多个 catch 语句,用于捕获不同类型的异常。

1.抛出异常:

可以使用throw语句在代码块中的任何地方抛出异常,throw语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。

【例1】除以零时抛出异常

double division(int a, int b)
{
   if( b == 0 )
   {
      throw "Division by zero condition!";
   }
   return (a/b);
}
2.捕获异常:

catch块跟在try块后面,用于捕获异常。catch关键字后的括号里的异常声明决定了要捕获的异常类型。

【例2】

try
{
   // 保护代码
}catch( ExceptionName e )
{
  // 处理 ExceptionName 异常的代码
}

例2中的代码,是捕获一个类型为ExceptionName的异常, 如果想让 catch 块能够处理 try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号 ...

【例3】

try
{
   // 保护代码
}catch(...)
{
  // 能处理任何异常的代码
}
3.C++标准的异常:

异常描述
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当使用了一个无效的数学域时,会抛出该异常。
std::invalid_argument当使用了无效的参数时,会抛出该异常。
std::length_error当创建了太长的 std::string 时,会抛出该异常。
std::out_of_range该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator。
std::runtime_error理论上不可以通过读取代码来检测到的异常。
std::overflow_error当发生数学上溢时,会抛出该异常。
std::range_error当尝试存储超出范围的值时,会抛出该异常。
std::underflow_error当发生数学下溢时,会抛出该异常。
4.除以零的异常,并在catch块中捕获异常:

【例4】

#include 

double division(int x, int y);

using namespace std;

int main() {
    int x = 50;
    int y = 0;
    double z = 0;

    try{
        z = division(x,y);
        cout< 

在该例中,抛出的异常类型位const char*的异常,在捕获异常时,必须在catch块中使用const char*。

5.定义新的异常:

可以使用继承和重载exception类来定义新的异常。

使用std::exception类来实现自己的异常。

 【例5】

#include 
#include 
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)
  {
    //其他的错误
  }
}

what() 是异常类提供的一个公共方法,它已被所有子异常类重载。这将返回异常产生的原因。

 

 

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1038906.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号