C++中异常类的使用方法

C++有很多的标准异常类:

namespace std

{

    //exception派生

    class logic_error; //逻辑错误,在程序运行前可以检测出来

 

    //logic_error派生

    class domain_error; //违反了前置条件

    class invalid_argument; //指出函数的一个无效参数

    class length_error; //指出有一个超过类型size_t的最大可表现值长度的对象的企图

    class out_of_range; //参数越界

    class bad_cast; //在运行时类型识别中有一个无效的dynamic_cast表达式

    class bad_typeid; //报告在表达试typeid(*p)中有一个空指针p

   

    //exception派生

    class runtime_error; //运行时错误,仅在程序运行中检测到

   

    //runtime_error派生

    class range_error; //违反后置条件

    class overflow_error; //报告一个算术溢出

    class bad_alloc; //存储分配错误

}

     请注意观察上述类的层次结构,可以看出,标准异常都派生自一个公共的基类exception。基类包含必要的多态性函数提供异常描述,可以被重载。下面是exception类的原型:

class exception

{

public:

    exception() throw();

    exception(const exception& rhs) throw();

    exception& operator=(const exception& rhs) throw();

    virtual ~exception() throw();

    virtual const char *what() const throw();

};

    其中的一个重要函数为what(),它返回一个表示异常的字符串指针。

    标准库异常类定义在以下四个头文件中

    1、exception头文件:定义了最常见的标准异常类,其类名为exception。只通知异常的产生,但不会提供更多的信息

    2、stdexcept头文件定义了以下几种常见异常类

   函数                                                     功能或作用

exception                                                最常见的问题

runtime_error                                          运行时错误:仅在运行时才能检测到的问题

range_error                                             运行时错误:生成的结果超出了有意义的值域范围

overflow_error                                        运行时错误:计算上溢

underflow_error                                      运行时错误:计算下溢

 

logic_error                                                逻辑错误:可在运行前检测到的问题

domain_error                                          逻辑错误:参数的结果值不存在

invalid_argument                                    逻辑错误:不合适的参数

length_error                                             逻辑错误:试图生成一个超出该类型最大长度的对象

out_of_range                                            逻辑错误:使用一个超出有效范围的值

    3、new头文件定义了bad_alloc异常类型,提供因无法分配内存而由new抛出的异常

    4、type_info头文件定义了bad_cast异常类型(要使用type_info必须包含typeinfo头文件)

    下面是使用异常类的例子:

    首先,我定义了几个异常类,这些类也可以从标准异常类进行派生,如下

class BadInitializers
{
public:
 BadInitializers() {}
};

class OutOfBounds
{
public:
 OutOfBounds(int i) { cout<<"Size "<<i<<" is illegal!!!"<<endl; }
};

class SizeMismatch
{
public:
 SizeMismatch() {}
};

 

然后要在程序中需要的地方使用throw来抛出异常类,两个抛出异常类的例子如下

template <class T>
Array1D<T>::Array1D(int sz)
{
 if(sz<0)
 {
    //throw BadInitializers();

    throw invalid_argument("Size has to be bigger than 0!!!");
 }
 size=sz;
 element=new T[size];
}

template <class T>
T &Array1D<T>::operator[](int i) const
{
 if(i<0||i>=size)
 {
  throw OutOfBounds(i);
 }
 return element[i];
}

 

然后在主程序中使用try...catch...来捕获异常,并进行相应的处理,如下

try
 {
  int i=0;
  Array1D<int> a1(5);
  a1[0]=1;
  a1[1]=3;
  a1[2]=5;
  a1[3]=7;
  a1[4]=8;
  Array1D<int> a2(a1);
  for(i=0;i<a2.Size();i++)
  {
   cout<<a2[i]<<" ";
  }
  cout<<endl;

  Array1D<int> a3(5);
  a3=a1+a2;
  cout<<a3;
   }
 catch(BadInitializers)
 {
  cout<<"Error:BadInitializers!!!"<<endl;
 }
 catch(OutOfBounds &e)
 {
  cout<<"Error:OutOfBounds!!!"<<endl;
 }
 catch(SizeMismatch &e)
 {
  cout<<"Error:SizeMismatch!!!"<<endl;
 }

 catch(invalid_argument &e)
 {
  cout<<"Error:"<<e.what()<<endl;
 }
 catch(...)
 {
  cout<<"An unknown error!!!"<<endl;
 }

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++ ,定义异常类的一般步骤如下: 1. 创建一个自定义的异常类,可以继承自 `std::exception` 或其派生类。 2. 在异常类添加适当的成员变量和成员函数,用于描述和处理异常情况。 3. 在需要抛出异常的地方,使用 `throw` 关键字抛出一个异常对象。 下面是一个简单的示例,展示了如何定义和抛出一个自定义的异常类: ```cpp #include <exception> #include <string> class MyException : public std::exception { public: MyException(const std::string& message) : message_(message) {} const char* what() const noexcept override { return message_.c_str(); } private: std::string message_; }; void someFunction() { // 假设发生了某种错误 throw MyException("发生了错误"); } int main() { try { someFunction(); } catch (const MyException& e) { // 捕获并处理异常 std::cout << "捕获到异常: " << e.what() << std::endl; } return 0; } ``` 在上述示例,`MyException` 继承自 `std::exception` 类,并重写了 `what()` 成员函数来提供异常的错误信息。在 `someFunction()` 函数使用 `throw` 关键字抛出了一个 `MyException` 类型的异常对象。在 `main()` 函数使用 `try` 和 `catch` 块来捕获并处理异常。在捕获到异常后,可以使用 `e.what()` 来获取异常的错误信息并进行处理。 需要注意的是,抛出的异常对象可以是任意类型,但通常推荐使用自定义的异常类来提供更具体的异常信息。处理异常时,可以根据不同的异常类型进行不同的处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值