• c++ logic_error() 异常的使用方法


    c++ std::logic_error 异常的使用方法

    *** 简单的用法就是如下所示. 抛出一个logic_error()异常,接住,展示.
    $ cat main.cpp
    #include
    #include
    using namespace std;
    int main()
    {
        try
        {
    //        logic_error e("test this");
            logic_error e(string("test this ")+"and that"); //显示了字符串类可以直接用+来连接
            throw e; //exception 用法, 如此构造和抛出异常
        }
        catch(exception &ex)    // exception 的用法,如此接受异常
        {
            printf("catch %s\n",ex.what()); //exception 用法,如此访问异常
        }
        return 0;
    }

    不爽的地方是ctags认不准这种结构了, 在vim中查看很不方便.
    在gdb 中也不让查看. 非常不爽!
    (gdb) p e
      $1 =
    (gdb) ptype e
      type = class std::logic_error {
         
      }
     
    *** 那这个logic_error 到底是啥呢?
     有时候,c++ 的封装确实不好说是好是坏!
    logic_error 是一个exception 的继承类,
    在/usr/include/c++/9/stdexcept 文件中定义.
    通过qtcreator 找到, 有时IDE 确实在找定义方面更准更强!
    // 下面内容有简化
     class logic_error : public exception
      {
        char * _M_msg; //保存信息

      public:
        logic_error(const string& __arg) _GLIBCXX_TXN_SAFE;
        logic_error(const char*) _GLIBCXX_TXN_SAFE;
        logic_error(logic_error&&) noexcept;
        logic_error& operator=(logic_error&&) noexcept;
        logic_error(const logic_error&) = default;
        logic_error& operator=(const logic_error&) = default;
        virtual ~logic_error() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW;

        /** Returns a C-style character string describing the general cause of
         *  the current error (the same string passed to the ctor).  */
        virtual const char*
        what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW;
      };

      可以看出它主要是一些构造函数 和 what() 函数, 无它了, 再看一下exception 类

     class exception
      {
      public:
        exception() _GLIBCXX_NOTHROW { }
        virtual ~exception() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW;
        exception(const exception&) = default;
        exception& operator=(const exception&) = default;
        exception(exception&&) = default;
        exception& operator=(exception&&) = default;

        /** Returns a C-style character string describing the general cause
         *  of the current error.  */
        virtual const char*
        what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW;
      };

      看来exception 就是一个接口类,logic_error是其一个实现类了.
      会像示例那样使用就可以了.

    再给一个具体的使用实例,加深对std::exception ,std::logic_error使用的理解。

    1. #include // std::cout std::endl
    2. #include // std::domain_error, logic_error
    3. #include // std::sqrt
    4. double mysqrt(double value)
    5. {
    6. if (value < 0)
    7. {
    8. // throw std::exception("需要开平方的参数不能是负数"); // exception 不支持字符串参数
    9. throw std::logic_error("需要开平方的参数不能是负数");
    10. // throw std::domain_error("需要开平方的参数不能是负数"); // 也可以用domain_error,与logic_error 是2种实现,你也可以书写自己的exception 类,继承自std::exception
    11. }
    12. return sqrt(value);
    13. }
    14. int main(void)
    15. {
    16. try
    17. {
    18. std::cout << mysqrt(100) << std::endl;
    19. std::cout << mysqrt(-100) << std::endl;
    20. return 0;
    21. }
    22. catch (const std::exception &e)
    23. {
    24. std::cout << e.what() << std::endl;
    25. }
    26. return 0;
    27. }

    如果对std::logic_error 还有疑惑的地方,我这里实现一个自己的exception, 它的功能等同于std::logic_error, 并且还给出了测试程序,一并在代码段中给出.

    1. $ cat myexception.h
    2. #ifndef _MY_EXCEPTION_H
    3. #define _MY_EXCEPTION_H
    4. #include
    5. #include
    6. class MyException : public std::exception
    7. { //定义MyException 类
    8. public:
    9. MyException(const std::string &msg): _msg(msg){}
    10. ~MyException() throw() {}
    11. const char *what() const throw() { return _msg.c_str(); }
    12. private:
    13. std::string _msg;
    14. };
    15. #endif
    16. hjj@hjj-7090:~/test/myexception$ cat main.cpp
    17. #include
    18. #include "myexception.h"
    19. using namespace std;
    20. int main(void)
    21. {
    22. try
    23. {
    24. throw MyException("an error ocurred!");
    25. printf("this line won't executed!\n");
    26. }
    27. catch(exception &e)
    28. {
    29. cout<<"catched "<what()<
    30. }
    31. }

    执行结果:

    $ ./myexception
    catched an error ocurred!

  • 相关阅读:
    s2最少删除多少字符可以成为s1的子串
    【C刷题训练营】第三讲(c语言入门训练)
    nodejs+vue养老人员活体鉴权服务系统elementui
    windows安装数据库MySQL
    Qt中https的使用,报错TLS initialization failed和不能打开ssl.lib问题解决
    Django ORM 事务和查询优化
    爬虫 — App 爬虫(一)
    TiKV+SPDK,探索存储的性能极限
    java-net-php-python-jsp高校师生交流平台计算机毕业设计程序
    基于ssm的兴趣班和延时班管理系统-计算机毕业设计
  • 原文地址:https://blog.csdn.net/hejinjing_tom_com/article/details/127997776