真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

編程筆記001|C++中的異常機制與dynamic-創(chuàng)新互聯(lián)

一、C++ 中的異常機制 (exceptions)
  1. 頭文件cstdlib/stdlib.h包含:
    1. std::abort()可以向標準錯誤流cerr發(fā)送消息abnormal program termination, 然后終止程序.
    2. std::exit(...)/exit(...)刷新文件緩沖區(qū)而不顯示消息.
  2. 常見異常機制:
    1. try表示注意該代碼塊引發(fā)的異常.
    2. throw類似跳轉(zhuǎn), 常見的是throw "...".
    3. catch (type)處理異常.
    4. 進階版本:
      1. 可以throw一個類對象 (直接構造函數(shù)形式throw classname(x, y, ...)),catch中調(diào)用對象接口函數(shù).
      2. 異常規(guī)范: 現(xiàn)在不常用. 剩下一個noexcept放在函數(shù)聲明后面表示不會引發(fā)異常.
      3. 棧解退 (unwinding the stack):throw完之后層層棧解退, 直到到達try所在那層, 然后 “搜尋”catch. 與此同時自動變量, 對象會相應析構.

        throw語句將控制權向上返回給第一個滿足如下條件的函數(shù): 包含能夠捕獲相應異常的try-catch組合.

        創(chuàng)新互聯(lián)公司服務項目包括金川網(wǎng)站建設、金川網(wǎng)站制作、金川網(wǎng)頁制作以及金川網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,金川網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到金川省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
        • throw自動生成副本, 但仍然建議在catch中使用引用. 主要原因是可以執(zhí)行派生類對象.
        • catch塊的排列順序應和類的派生順序相反 (否則引用出問題).
    5. 頭文件exception包含exception類, 用class classname: public std::exception可以使用其中的what()方法, 一般return一個字符串.
    6. 頭文件stdexcept十分萬能:
      1. logic_error系列
        1. domain_error: 函數(shù)定義域.
        2. invalid_argument: 傳遞的字符串出錯.
        3. length_error: 空間不夠 (e.g.數(shù)組).
        4. out_of_bounds: 索引無效.
      2. runtime_error系列
        1. range_error: 除了下面兩者的所有.
        2. overflow_error: 超過變量類型大范圍.
        3. underflow_error: 低于了浮點數(shù)最小表示值.
      3. bad_allocexception公有派生.
      4. std::nowthrow,std::nothrow.
  3. 異常何時出現(xiàn)問題
    1. 未捕獲異常
      1. 調(diào)用terminate()函數(shù). (頭文件exception)
        1. terminate()默認調(diào)用abort()函數(shù), 但可以通過set_terminate()函數(shù)修改行為 (但必須包含一個需調(diào)用的函數(shù)).
          typedef void (*terminate_handler)();
             terminate_handler set_terminate(terminate_handler f) throw();
             terminate_handler set_terminate(terminate_handler f) noexcept;
             void terminate();
             void terminate() noexcept;
      2. 調(diào)用unexpected()函數(shù). 可用set_unexpected修改 (默認調(diào)用terminate).
    2. 一些不易引起注意的事項
      1. 如果用了new進行內(nèi)存分配, 過早的終止會導致相應的delete語句不被執(zhí)行, 導致內(nèi)存泄漏.

        解決方案:

        • catch語句中加入相應的delete語句.
        • (后文會提到) 智能指針模板.
二、與異常機制相結合: 更安全的四種類型轉(zhuǎn)換
  1. RTTI (Runtime Type Identification 運行階段類型識別)
    1. 用途: 虛函數(shù)能夠 “自動” 地知道某指針指向的對象類型, 并自動調(diào)用其方法, 而如果我們需要把這一功能 “解封裝”, 那就要用到 RTTI.
    2. 實現(xiàn)
      1. Class1ptr* c1 = dynamic_cast(var): 只會告訴你轉(zhuǎn)換是否安全, 但不會告訴你具體是什么類型. 不安全返回空指針. 配合if可以包含檢驗環(huán)節(jié).

        另外幾種常見的強制類型轉(zhuǎn)換:

        • static_cast: 幾乎與dynamic_cast相同, 但是沒有錯誤檢查機制. 同時dynamic_cast能夠檢查形如 “A 同時派生了 B 和 C, B 與 C 之間的類型轉(zhuǎn)換 (返回nullptr)”, 但static_cast不行. 但static_cast還允許枚舉類型和整型之間以及數(shù)值類型之間的轉(zhuǎn)換。

          注: 這兩種轉(zhuǎn)換在開發(fā)人員進行安全保證的情況下還可以脫離類來轉(zhuǎn)換 (int ->char, etc.).

        • reinterpret_cast: “近乎萬能”, 不關心類的繼承關系.

        • const_cast: 把常量指針 / 引用轉(zhuǎn)換為非常量指針 / 引用 (好處是確保了大部分時候的安全性).

      2. typeid(用到頭文件typeinfo) 重載了運算符==!=, 常見有:
        1. typeid(var1 / typename1) == typeid(var2 / typename2)
        2. typeid(varname).name()

        重要提示: 如果發(fā)現(xiàn)在擴展的if else語句中使用了typeid, 則應考慮是否應該使用虛函數(shù)和dynamic_cast.

參考文獻:C++ Primer Plus, 6th edition
歡迎關注我的博客! Find me on GitHub: GitHub profile page Gitee account (under construction): Gitee site GitLab account (under construction): GitLab site Also find me on Luogu:Luogu profile 歡迎大家關注我,在項目上與我協(xié)作哦!

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站題目:編程筆記001|C++中的異常機制與dynamic-創(chuàng)新互聯(lián)
當前URL:http://weahome.cn/article/dcssgs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部