zoukankan      html  css  js  c++  java
  • C++ 异常处理

    C++ 异常处理

    异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。

    异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw

    • throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
    • catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
    • try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。

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

    const throw() 不是函数,这个东西叫异常规格说明,表示 what 函数可以抛出异常的类型,类型说明放到 () 里,这里面没有类型,就是声明这个函数不抛出异常,通常函数不写后面的就表示函数可以抛出任何类型的异常。

    class MyException :public exception
    {
    
        public:
            const char* what() const throw(){
                 return "my exception";
            }
    
    };

    异常规格说明

    1、异常规格说明的目的是为了让函数使用者知道该函数可能抛出的异常有哪些。
    可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如:

    void fun() throw(A,B,C,D);

    2、若无异常接口声明,则此函数可以抛掷任何类型的异常。

    3、不抛掷任何类型异常的函数声明如下:

    #include <iostream>
    #include <exception>
    using namespace std;
    
    class MyException
    {
    public:
        MyException(const char *message)
            : message_(message)
        {
            cout << "MyException ..." << endl;
        }
        MyException(const MyException &other) : message_(other.message_)
        {
            cout << "Copy MyException ..." << endl;
        }
        virtual ~MyException()
        {
            cout << "~MyException ..." << endl;
        }
    
        const char *what() const
        {
            return message_.c_str();
        }
    private:
        string message_;
    };
    
    class MyExceptionD : public MyException
    {
    public:
        MyExceptionD(const char *message)
            : MyException(message)
        {
            cout << "MyExceptionD ..." << endl;
        }
        MyExceptionD(const MyExceptionD &other)
            : MyException(other)
        {
            cout << "Copy MyExceptionD ..." << endl;
        }
        ~MyExceptionD()
        {
            cout << "~MyExceptionD ..." << endl;
        }
    };
    
    void fun(int n) throw (int, MyException, MyExceptionD)
    {
        if (n == 1)
        {
            throw 1;
        }
        else if (n == 2)
        {
            throw MyException("test Exception");
        }
        else if (n == 3)
        {
            throw MyExceptionD("test ExceptionD");
        }
    
    }
    
    void fun2() throw()
    {
    
    }
    
    int main(void)
    {
        try
        {
            fun(2);
        }
    
        catch (int n)
        {
            cout << "catch int ..." << endl;
            cout << "n=" << n << endl;
        }
        catch (MyExceptionD &e)
        {
            cout << "catch MyExceptionD ..." << endl;
            cout << e.what() << endl;
        }
        catch (MyException &e)
        {
            cout << "catch MyException ..." << endl;
            cout << e.what() << endl;
        }
    
        return 0;
    }
  • 相关阅读:
    Spring MVC 核心组件详解
    Spring MVC 入门就这一篇
    Spring 事务解决方案
    【UGUI源码分析】Unity遮罩之Mask详细解读
    游戏开发中不同时区下的时间问题
    ARTS第十三周(阅读Tomcat源码)
    Win10 电脑安装.NET低版本提示“这台计算机中已经安装了 .NET Framwork 4.6.2或版本更高的更新”问题
    Dynamics 365 Setup 提示SqlServer 存在
    Dynamics CRM "Verification of prerequisites for Domain Controller promotion failed. Certificate Server is installed."
    Dynamics CRM
  • 原文地址:https://www.cnblogs.com/amwuau/p/7601494.html
Copyright © 2011-2022 走看看