C++进阶STL-异常处理

墨蓝 2022-05-09 06:42 217阅读 0赞

异常抛出是跨函数的

  • 返回值:只是返回给调用的这一层函数
  • 异常:最里面的函数func1如果抛出异常给 调用的func2 , 如果func2没有处理, 再抛出给调用func2 的 func3, 如果在最上层的还没处理,则程序终止。

栈解旋

  • 当函数抛出异常的时候,此函数体内定义的局部变量自动析构、释放。

异常的接口申明

  1. (1)可以抛出 int char float类型的异常,不可以抛其他类型的异常
  2. Void fun1() throw(int, char, float)
  3. {
  4. }
  5. (2)不可以抛出任何异常
  6. Void fun2() throw()
  7. {
  8. }
  9. (3)可以抛出任何异常
  10. Void fun2()
  11. {
  12. }
  13. --------------------------------------------------------------------------------------------
  14. (4)异常捕获
  15. try
  16. {
  17. func();
  18. }
  19. catch(...)//三个点表示捕获所有异常
  20. {
  21. }

自定义异常类

  1. class MyException
  2. {
  3. public:
  4. MyException(const char* err)
  5. {
  6. error=new char [strlen(err+1)];
  7. strcpy(error,err);
  8. }
  9. ~MyException()
  10. {
  11. if(error!=NULL)
  12. delete [] error;
  13. }
  14. void what()
  15. {
  16. cout << error << endl;
  17. }
  18. private:
  19. char* error;
  20. };
  21. int func1(int a,int b )throw(MyException)
  22. {
  23. if(b==0)
  24. throw MyException("divider is zero") ;
  25. return a/b;
  26. }
  27. int main(void)
  28. {
  29. try
  30. {
  31. func1(10,0);
  32. }
  33. catch(MyException& e)
  34. {
  35. e.what();
  36. }
  37. return 0;
  38. }

异常类对象的生命周期

  1. 抛出是对象,接收也是对象: 所有对象在catch语句处理完析构
  2. 抛出对象,用引用接收: 引用直接指向抛出的对象,不用再调用拷贝构造,只有一个对象,它也在catch语句处理完析构
  3. 抛出是临时对象地址,接收用指针: 在catch语句之前就析构了,那么在catch语句中就不能调用异常类的方法了。这时候需要在抛出的时候进行 new;在catch 语句处理完再释放。

继承C++标准异常库

  1. 重载what 函数
    Virtual Const char * what() const throw()
    {
    }
  2. 重载虚析构函数
    virtual ~MyException() throw()
    {
    }

发表评论

表情:
评论列表 (有 0 条评论,217人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++STL-函数对象

    函数对象的概念  重载  ()操作符  的类,它的对象叫做函数对象,即它是 类似于函数的 对象(它可以向函数一样调用),也叫作仿函数。 注意:函数对象(

    相关 C++STL-异常处理

    异常抛出是跨函数的 返回值:只是返回给调用的这一层函数 异常:最里面的函数func1如果抛出异常给 调用的func2 , 如果func2没有处理, 再抛出给调

    相关 C++STL-模板

    模板的机制 模板并不是能处理任何类型的数据,只是它根据传入参数的类型的不同生成了不同的 函数/类 体(我们在不使用函数模板的正常操作,只不过编译器帮我们做了)。在此编译过