最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++無try-catch的異常捕獲示例詳解

 更新時間:2022年12月07日 14:34:45   作者:amjieker  
這篇文章主要為大家介紹了C++無try-catch的異常捕獲示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

try-catch

在c++中,我們可以非常方便的使用try catch來捕獲異常

try {
  throw 1;
} catch (int x) {
  cout << "x " << x << endl;
  throw std::runtime_error("exception");
} catch (...) {
  cout << "exception" << endl;
}

你可能有時候 c++的try-catch沒什么用

但事實上,在解決某些問題方面,c++的異常強過你自己打flag 判斷 比如下面這個例子

void dep2() {
  cout << "ok" << endl;
  throw "error";
}
void dep1() {
  dep2();
  cout << "ok call dep2" << endl;
}
void func() {
  dep1();
  cout << "ok call dep1" << endl;
}
signed main() {
  try {
    func();
  } catch (...) {
    cout << "error" << endl;
  }
  return 0;
}

不使用try-catch 可以怎么寫?

pair<int, string> dep2() {
  cout << "ok" << endl;
  return {-1, "error"};
  cout << "ret" << endl;
  return {0, ""};
}
pair<int, string> dep1() {
  auto[ret, err] = dep2();
  if (ret == -1) return {ret, err};
  cout << "ok call dep2" << endl;
  return {0, ""};
}
pair<int, string> func() {
  auto[ret, err] = dep1();
  if (ret == -1) return {ret, err};
  cout << "ok call dep1" << endl;
  return {0, ""};
}
signed main() {
  auto[ret, err] = func();
  if (ret == -1) cout << err << endl;
  return 0;
}

可以看出, try-catch還是可以幫助我們減少一些沒必要的判段和代碼

沒有try-catch的日子

上述是c++的。那么。。。c語言怎么辦呢? 那么,大抵是這樣的 用返回值來充當狀態(tài)碼返回,傳參留一個空位接受返回數(shù)據(jù)。

/**
* -1 error
*  0 ok
*    other
**/
int func(int parameter, int* ret) {}

goto 是什么?

goto 語句允許把控制無條件轉(zhuǎn)移到同一函數(shù)內(nèi)的被標記的語句在任何編程語言中,都不建議使用 goto 語句。因為它使得程序的控制流難以跟蹤,使程序難以理解和難以修改。任何使用 goto 語句的程序可以改寫成不需要使用 goto 語句的寫法。E.W.Dijikstra 在1965年提出結(jié)構(gòu)化程序設(shè)計來規(guī)避這種錯誤

goto 就沒有他的優(yōu)點的嗎?

goto是個好東西,就是得小心用。

現(xiàn)在的建議是不使用goto,且把goto妖魔化了

確實可以使用 while for之類的東西來替代goto

但是在有些時候,goto還是有一丟丟作用的。

例如:

signed main() {
  for (int i = 1; i <= 1000; i++) {
    for (int j = 1; j <= 1000; j++) {
      for (int k = 1; k <= 1000; k++) {
        if (i == 11 && j == 22 && k == 555)
          goto end;
      }
    }
  }
  end:
  return 0;
}
signed main() {
  bool flag = true;
  for (int i = 1; i <= 1000 && flag; i++) {
    for (int j = 1; j <= 1000 && flag; j++) {
      for (int k = 1; k <= 1000 && flag; k++) {
        if (i == 11 && j == 22 && k == 555)
          flag = false;
      }
    }
  }
  return 0;
}

拋開程序本身不談,有時候使用goto跳出多級循環(huán)的便利性,更勝一籌。

不同函數(shù)之間跳轉(zhuǎn)

上述講的goto只能在同一個函數(shù)內(nèi)進行跳轉(zhuǎn),不能夠跨函數(shù)跳轉(zhuǎn)

setjmp 和 longjmp

setjmp

setjmp()函數(shù)保存關(guān)于調(diào)用環(huán)境的各種信息(通常是堆棧指針、 緩沖區(qū)env中的指令指針,可能是其他寄存器的值和信號掩碼) 稍后由longjmp()使用。調(diào)用時,setjmp()返回0。(用man setjmp查看更詳細的介紹)

創(chuàng)建本地的jmp_buf緩沖區(qū)并且初始化,用于將來跳轉(zhuǎn)回此處。這個子程序保存程序的調(diào)用環(huán)境于env參數(shù)所指的緩沖區(qū),env將被longjmp使用。如果是從setjmp直接調(diào)用返回,setjmp返回值為0。如果是從longjmp恢復(fù)的程序調(diào)用環(huán)境返回,setjmp返回非零值。

longjmp

在執(zhí)行l(wèi)ongjmp之時,傳入一個保存好的jmp_buf和一個返回值,程序就會切換上下文跨函數(shù)的跳轉(zhuǎn)到 之前設(shè)置的setjump處執(zhí)行。

例子

jmp_buf env;
signed main() {
  int stat = 0;
  if ((stat = setjmp(env)) == 1) {
    printf("1");
    return 1;
  }
  printf("0");
  longjmp(env, 1);
  return 0;
}
// 結(jié)果:
>. 01

原理,進程是一個狀態(tài)機,我們當前的執(zhí)行時刻擁有的狀態(tài)有 寄存器的值,pc指針,堆棧信息等。 和上下文切換一樣,我們可以保存一下當前進程的信息在jmp_buf里面,然后,等longjmp調(diào)用時,再去以保存的時候的進程信息去“切換”掉當前的狀態(tài)信息,實現(xiàn)了跳轉(zhuǎn)執(zhí)行的過程,由于這個和上下文切換還是有區(qū)別,是切換回去當前進程。所以保存一下必要的寄存器值就可以了。

無try-catch的異常捕獲

利用宏替換和switch來匹配錯誤

可以簡單的實現(xiàn)異常的捕獲和跳轉(zhuǎn)

(還是c++的try-catch更強大)

#include <bits/stdc++.h>
#include <setjmp.h>
struct EXP {
  jmp_buf buf;
  int stat;
};
#define BEGIN_EXP(exp) switch (setjmp(exp.buf))
#define TRY(body) case 0: body break;
#define CATCH(exp, body) case exp: body break;
#define THROW(exp, data) longjmp(exp.buf, data)
int main() {
  EXP exp;
  BEGIN_EXP(exp) {
    TRY({
      std::cout << " data" << std::endl;
      THROW(exp, 1);
    })
    CATCH(1, {
      std::cout << "error 1" << std::endl;
      THROW(exp, 2);
    })
    CATCH(2, {
      std::cout << "error 2" << std::endl;
      THROW(exp, 3);
    })
    CATCH(3, {
      std::cout << "error 2" << std::endl;
    })
  }
  return 0;
}

以上就是C++無try-catch的異常捕獲示例詳解的詳細內(nèi)容,更多關(guān)于C++無try-catch異常捕獲的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 不要被C++(自動生成規(guī)則)所蒙騙

    不要被C++(自動生成規(guī)則)所蒙騙

    正如標題所說,我們不要被C++語法中所描述的那些條條框框所“蒙騙”了。的確,相信這些生成規(guī)則不會對我們的編程帶來多大的影響(不會產(chǎn)生錯誤),但是只有了解它們的背后操作,我們才知道編譯器究竟為我們做了什么,感興趣的朋友可以了解下,希望本文對你有所幫助
    2013-01-01
  • C++獲得文件狀態(tài)信息的方法

    C++獲得文件狀態(tài)信息的方法

    這篇文章主要介紹了C++獲得文件狀態(tài)信息的方法,包括文件狀態(tài)信息、文件所在磁盤盤符、文件創(chuàng)建時間、訪問時間及修改日期等,需要的朋友可以參考下
    2015-07-07
  • VSCode下.json文件的編寫之(1) linux/g++ (2).json中參數(shù)與預(yù)定義變量的意義解釋

    VSCode下.json文件的編寫之(1) linux/g++ (2).json中參數(shù)與預(yù)定義變量的意義解釋

    這篇文章主要介紹了VSCode下.json文件的編寫之(1) linux/g++ (2).json中參數(shù)與預(yù)定義變量的意義解釋,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C語言實現(xiàn)掃雷小程序

    C語言實現(xiàn)掃雷小程序

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • MFC創(chuàng)建模態(tài)對話框和非模態(tài)對話框的方法

    MFC創(chuàng)建模態(tài)對話框和非模態(tài)對話框的方法

    這篇文章主要介紹了MFC創(chuàng)建模態(tài)對話框和非模態(tài)對話框的方法,需要的朋友可以參考下
    2014-07-07
  • C++與QML進行數(shù)據(jù)交互的常見方法總結(jié)

    C++與QML進行數(shù)據(jù)交互的常見方法總結(jié)

    這篇文章主要為大家詳細介紹了C++與QML進行數(shù)據(jù)交互的常見方法,文中 的示例代碼講解詳細,具有一定的參考價值,有需要的小伙伴可以跟隨小編一起了解一下
    2023-10-10
  • C++學(xué)習(xí)進階篇之類大小計算和this指針

    C++學(xué)習(xí)進階篇之類大小計算和this指針

    this是C++中的一個關(guān)鍵字,也是一個const指針,它指向當前對象,通過它可以訪問當前對象的所有成員,下面這篇文章主要給大家介紹了關(guān)于C++學(xué)習(xí)進階篇之類大小計算和this指針的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • C語言實現(xiàn)俄羅斯方塊課程設(shè)計

    C語言實現(xiàn)俄羅斯方塊課程設(shè)計

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)俄羅斯方塊課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 如何利用C語言位運算解決只出現(xiàn)一次的數(shù)字

    如何利用C語言位運算解決只出現(xiàn)一次的數(shù)字

    這篇文章主要給大家介紹了關(guān)于如何利用C語言位運算解決只出現(xiàn)一次的數(shù)字的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C語言版約瑟夫問題算法實現(xiàn)

    C語言版約瑟夫問題算法實現(xiàn)

    大家好,本篇文章主要講的是C語言版約瑟夫問題算法實現(xiàn),感興趣的同學(xué)趕快來看一看吧,對你又幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評論

岑巩县| 谢通门县| 金堂县| 嘉峪关市| 渝中区| 绿春县| 云龙县| 尉氏县| 阜新| 什邡市| 张家港市| 伊吾县| 濉溪县| 甘泉县| 隆回县| 津市市| 田阳县| 合水县| 阿拉善左旗| 宜宾县| 独山县| 富顺县| 黔西县| 南华县| 阳西县| 江北区| 四会市| 原阳县| 松江区| 武强县| 玛沁县| 西充县| 尤溪县| 静乐县| 荆门市| 峨山| 黄梅县| 武清区| 安义县| 三原县| 阳新县|