Guru of the Week 条款08:GotW挑战篇——异常处理的安全性

 

GotW #08 CHALLENGE EDITION Exception Safety

著者:Herb Sutter     

翻译:kingofark

[声明]:本文内容取自www.gotw.ca网站上的Guru of the Week栏目,其著作权归原著者本人所有。译者kingofark在未经原著者本人同意的情况下翻译本文。本翻译内容仅供自学和参考用,请所有阅读过本文的人不要擅自转载、传播本翻译内容;下载本翻译内容的人请在阅读浏览后,立即删除其备份。译者kingofark对违反上述两条原则的人不负任何责任。特此声明。

Revision 1.0

Guru of the Week 条款08GotW挑战篇——异常处理的安全性

 

难度:9 / 10

 

(异常处理机制是解决某些问题的上佳办法,但同时它也引入了许多隐藏的控制流程;有时候,要正确无误的使用它并不容易。不妨试试自己实现一个简单的container(这是一种可以对其进行pushpop操作的栈),看看它在异常-安全的(exception-safe)和异常-中立的(exception-neutral)情况下,到底会发生哪些事情。)

 

 

[问题]

 

1.  实现如下异常-中立的(exception-neutralcontainer。要求:Stack对象的状态必须保持其一致性(consistent);即使有内部操作抛出异常,Stack对象也必须是可析构的(destructible);T的异常必须能够传递到其调用者那里。

 

    template <class T>
  
  
        // T 必须有缺省的构造函数和拷贝构造函数
  
  
    class Stack
  
  
    {
  
  
    public:
  
  
        Stack();
  
  
        ~Stack();
  
  
        Stack(const Stack&);
  
  
        Stack& operator=(const Stack&);
  
  
 
  
  
        unsigned Count();   // 返回T在栈里面的数目
  
  
        void     Push(const T&);
  
  
        T        Pop();     // 如果为空,则返回缺省构造出来的T
  
  
 
  
  
    private:
  
  
        T*       v_;        // 指向一个用于'vsize_' T对象的
  
  
                            //  足够大的内存空间
  
  
        unsigned vsize_;    // 'v_' 区域的大小
  
  
        unsigned vused_;    // 'v_' 区域中实际使用的T的数目
  
  
    };
  
  

 

 

附加题:

 

2.  根据当前的C++标准,标准库中的container是异常-安全的(exception-safe)还是异常-中立的(exception-neutral)?

 

3.  应该让container成为异常-中立的(exception-neutral)吗?为什么?有什么折衷方案吗?

 

4.  Container应该使用异常规则吗?比如,我们到底应不应该作诸如“Stack::Stack()throw(bad_alloc);”的声明?

 

 

挑战极限的问题:

 

5.  由于在目前许多的编译器中使用trycatch会给你的程序带来一些额外的负荷,所以在我们这种低级的可复用(reusableContainer中,最好避免使用它们。你能在不使用try

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL操作参考文献: 1. "MySQL :: MySQL 8.0 Reference Manual :: 13.2.5.2 INSERT Statement," MySQL, accessed September 21, 2021, https://dev.mysql.com/doc/refman/8.0/en/insert.html. 2. "MySQL :: MySQL 8.0 Reference Manual :: 13.2.9 SELECT Statement," MySQL, accessed September 21, 2021, https://dev.mysql.com/doc/refman/8.0/en/select.html. 3. "MySQL :: MySQL 8.0 Reference Manual :: 13.2.10 UPDATE Statement," MySQL, accessed September 21, 2021, https://dev.mysql.com/doc/refman/8.0/en/update.html. Socket通信参考文献: 1. "Socket Programming in Python (Guide)," Real Python, accessed September 21, 2021, https://realpython.com/python-sockets/. 2. "Python Socket Programming Tutorial," Guru99, accessed September 21, 2021, https://www.guru99.com/python-socket-programming-tutorial.html. 3. "Python Network Programming - TCP/IP Socket Programming," Tutorialspoint, accessed September 21, 2021, https://www.tutorialspoint.com/python_network_programming/python_socket_programming.htm. Flask框架参考文献: 1. "Flask Documentation (2.1.x)," Flask, accessed September 21, 2021, https://flask.palletsprojects.com/en/2.1.x/. 2. "Flask Mega-Tutorial Part I: Hello, World!," Miguel Grinberg, accessed September 21, 2021, https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world. 3. "Flask Web Development with Python Tutorial - Full Course," FreeCodeCamp, accessed September 21, 2021, https://www.youtube.com/watch?v=MwZwr5Tvyxo. HTML参考文献: 1. "HTML5," W3C, accessed September 21, 2021, https://www.w3.org/TR/html5/. 2. "HTML Tutorial," W3Schools, accessed September 21, 2021, https://www.w3schools.com/html/. 3. "HTML Cheatsheet," OverAPI, accessed September 21, 2021, https://overapi.com/html-dom/. CSS参考文献: 1. "CSS," W3C, accessed September 21, 2021, https://www.w3.org/Style/CSS/. 2. "CSS Tutorial," W3Schools, accessed September 21, 2021, https://www.w3schools.com/css/. 3. "CSS Cheatsheet," OverAPI, accessed September 21, 2021, https://overapi.com/css/. JavaScript参考文献: 1. "ECMAScript® 2021 Language Specification," ECMA International, accessed September 21, 2021, https://tc39.es/ecma262/. 2. "JavaScript Tutorial," W3Schools, accessed September 21, 2021, https://www.w3schools.com/js/. 3. "JavaScript Cheatsheet," OverAPI, accessed September 21, 2021, https://overapi.com/javascript/.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kingofark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值