日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

C语言中的异常处理

發(fā)布時(shí)間:2025/4/5 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中的异常处理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1 C語(yǔ)言中的異常處理
      • 1.1 異常的概念
      • 1.2 C語(yǔ)言中經(jīng)典的異常處理方式
      • 1.3 異常處理方式的優(yōu)化

1 C語(yǔ)言中的異常處理

1.1 異常的概念

異常的概念:

  • 程序在運(yùn)行的過(guò)程中可能產(chǎn)生異常。
  • 異常(Exception)與Bug的區(qū)別:
    • 異常是程序運(yùn)行時(shí)可預(yù)料的執(zhí)行分支。
    • Bug是程序中的錯(cuò)誤,是不被預(yù)期的運(yùn)行方式。

異常(Exception)和Bug的對(duì)比:
異常:

  • 運(yùn)行時(shí)產(chǎn)生除0的情況
  • 需要打開(kāi)的外部文件不存在
  • 數(shù)組訪問(wèn)時(shí)越界

Bug:

  • 使用野指針
  • 堆數(shù)組使用結(jié)束未釋放
  • 選擇排序無(wú)法處理長(zhǎng)度為0的數(shù)組

1.2 C語(yǔ)言中經(jīng)典的異常處理方式

C語(yǔ)言經(jīng)典處理方式:if…else…

編程實(shí)驗(yàn):異常處理代碼

#include <iostream> #include <string>using namespace std;#define SUCCESS 0 #define INVALID_POINTER -1 #define INVALID_LENGTH -2 #define INVALID_PARAMETER -3int MemSet(void* dest, unsigned int length, unsigned char v) {if( dest == NULL ){return INVALID_POINTER;}if( length < 4 ){return INVALID_LENGTH;}if( (v < 0) || (v > 9) ){return INVALID_PARAMETER;}unsigned char* p = (unsigned char*)dest;for(int i=0; i<length; i++){p[i] = v;}return SUCCESS; }int main(int argc, char *argv[]) {int ai[5];int ret = MemSet(ai, sizeof(ai), 0);if( ret == SUCCESS ){}else if( ret == INVALID_POINTER ){}else if( ret == INVALID_LENGTH ){}else if( ret == INVALID_PARAMETER ){}return ret; }

編程實(shí)驗(yàn):除法操作異常處理

#include <iostream> #include <string>using namespace std;double divide(double a, double b, int* valid) {const double delta = 0.000000000000001;double ret = 0;if( !((-delta < b) && (b < delta)) ){ret = a / b;*valid = 1;}else{*valid = 0;}return ret; }int main(int argc, char *argv[]) { int valid = 0;double r = divide(1, 0, &valid);if( valid ){cout << "r = " << r << endl;}else{cout << "Divided by zero..." << endl;}return 0; }

上述異常處理方式的缺陷:

  • divide函數(shù)有3個(gè)參數(shù),難以理解其用法。
  • divide函數(shù)調(diào)用后必須判斷valid代表的結(jié)果。
    • 當(dāng)valid為true時(shí),運(yùn)算結(jié)果正常。
    • 當(dāng)valid為false時(shí),運(yùn)算過(guò)程出現(xiàn)異常。

1.3 異常處理方式的優(yōu)化

通過(guò)setjmp()和longjmp()進(jìn)行優(yōu)化:

  • int setjmp(jmp_buf env):將當(dāng)前上下文保存在jmp_buf結(jié)構(gòu)體中。
  • void longjmp(jmp_buf env, int val):
    • 從jmp_buf結(jié)構(gòu)體中恢復(fù)setjmp()保存的上下文。
    • 最終從setjmp函數(shù)調(diào)用點(diǎn)返回,返回值為val。

編程實(shí)驗(yàn):除法操作異常處理優(yōu)化

#include <iostream> #include <string> #include <csetjmp>using namespace std;static jmp_buf env;double divide(double a, double b) {const double delta = 0.000000000000001;double ret = 0;if( !((-delta < b) && (b < delta)) ){ret = a / b;}else{longjmp(env, 1);}return ret; }int main(int argc, char *argv[]) { if( setjmp(env) == 0 ){double r = divide(1, 1);cout << "r = " << r << endl;}else{cout << "Divided by zero..." << endl;}return 0; }

setjmp()和longjmp()的引入會(huì)帶來(lái)如下缺陷:

  • 必然涉及到使用全局變量。
  • 暴力跳轉(zhuǎn)導(dǎo)致代碼可讀性降低。
  • 本質(zhì)還是if…else…異常處理方式。

C語(yǔ)言中經(jīng)典異常處理方式會(huì)使得程序邏輯中混入大量的處理異常的代碼。正常邏輯代碼和異常處理代碼混合在一起,導(dǎo)致代碼迅速膨脹,難以維護(hù)。


參考資料:

  • C++深度解析教程
  • 總結(jié)

    以上是生活随笔為你收集整理的C语言中的异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。