日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

發布時間:2025/3/15 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言错误处理方法、C++异常处理方法(throw, try, catch)简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、C語言錯誤處理方法

1、返回值(if … else語句判斷錯誤)
2、errno(linux 系統調用)
3、goto語句(函數內局部跳轉)
4、setjmp、longjmp(Do not use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics.?)

#define _JBLEN ?16

typedef _JBTYPE ?jmp_buf[_JBLEN];

Saves the current state of the program.

int setjmp(jmp_buf env ); ?Parameters env

Variable in which environment is stored.

?Return Value

Returns 0 after saving the stack environment. If setjmp returns as a result of a?longjmp call, it returns the?value argument of?longjmp, or if the?value argument of?longjmp is 0,setjmp returns 1. There is no error return.


Restores stack environment and execution locale.

void?longjmp(?jmp_buf?env,?int?value? ); ?Parameters env

Variable in which environment is stored.

value

Value to be returned to setjmp call.

C++ Code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
? #include?<stdio.h>
#include?<setjmp.h>

jmp_buf?buf;

double?Divide(double?a,?double?b)
{
????if?(b?==?0.0)
????{
????????longjmp(buf,?1);????????//?throw
????}
????else
????????return?a?/?b;
}

int?main(void)
{
????int?ret;
????ret?=?setjmp(buf);
????if?(ret?==?0)???????????//?try
????{
????????printf("division?...\n");
????????printf("%f\n",?Divide(5.0,?0.0));
????}
????else?if?(ret?==?1)??????//?catch
????{
????????printf("divisiong?by?zero\n");
????}
????return?0;
}


分析一下,首先setjump設置成功返回0,執行Divide函數,除數為0,longjump跳回到setjump處,返回參數1,故繼續輸出

divisiong by zero, setjump和longjump 已經是c++異常的雛形,即使Divide函數本身沒有調用longjump,而是調用了某個函數,在這個函數內longjump,也可以跳轉到setjump 處,這樣就不用通過一層層的函數返回值來判斷錯誤。

C語言的出錯處理被認為是緊耦合的,函數的使用者必須在非常靠近函數調用的地方編寫錯誤處理代碼,這會使得其變得笨拙以及難以使用。


二、C++異常處理方法(throw, try, catch)

錯誤處理代碼的編寫不再冗長乏味,并且不再與“正常”代碼混在一起。程序員可以將注意力集中于正常流程,然后在某個區域里編寫異常處理代碼。如果多次調用同一個函數,只需在一個地方編寫一次錯誤處理代碼。
錯誤不能被忽略。

C++ Code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
? #include?<iostream>
using?namespace?std;

double?Divide(double?a,?double?b)
{
????if?(b?==?0.0)
????{
????????throw?1;????????//?throw
????}
????else
????????return?a?/?b;
}

int?main(void)
{
????try?????????//?try
????{
????????cout?<<?"division?..."?<<?endl;
????????cout?<<?Divide(3.0,?1.0)?<<?endl;
????????cout?<<?Divide(5.0,?0.0)?<<?endl;

????}
????catch?(int)?????//?catch
????{
????????cout?<<?"divisiong?by?zero"?<<?endl;
????}
????return?0;
}


即無論在多遠throw,都可以被catch到,但需要注意的是類型需要匹配,下面的文章將討論拋出自定義類型的異常。


參考:

C++ primer 第四版
Effective C++ 3rd
C++編程規范

轉載于:https://www.cnblogs.com/alantu2018/p/8471124.html

總結

以上是生活随笔為你收集整理的C语言错误处理方法、C++异常处理方法(throw, try, catch)简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。