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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言中的异常处理

發布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中的异常处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 C語言中的異常處理
      • 1.1 異常的概念
      • 1.2 C語言中經典的異常處理方式
      • 1.3 異常處理方式的優化

1 C語言中的異常處理

1.1 異常的概念

異常的概念:

  • 程序在運行的過程中可能產生異常。
  • 異常(Exception)與Bug的區別:
    • 異常是程序運行時可預料的執行分支。
    • Bug是程序中的錯誤,是不被預期的運行方式。

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

  • 運行時產生除0的情況
  • 需要打開的外部文件不存在
  • 數組訪問時越界

Bug:

  • 使用野指針
  • 堆數組使用結束未釋放
  • 選擇排序無法處理長度為0的數組

1.2 C語言中經典的異常處理方式

C語言經典處理方式:if…else…

編程實驗:異常處理代碼

#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; }

編程實驗:除法操作異常處理

#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函數有3個參數,難以理解其用法。
  • divide函數調用后必須判斷valid代表的結果。
    • 當valid為true時,運算結果正常。
    • 當valid為false時,運算過程出現異常。

1.3 異常處理方式的優化

通過setjmp()和longjmp()進行優化:

  • int setjmp(jmp_buf env):將當前上下文保存在jmp_buf結構體中。
  • void longjmp(jmp_buf env, int val):
    • 從jmp_buf結構體中恢復setjmp()保存的上下文。
    • 最終從setjmp函數調用點返回,返回值為val。

編程實驗:除法操作異常處理優化

#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()的引入會帶來如下缺陷:

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

C語言中經典異常處理方式會使得程序邏輯中混入大量的處理異常的代碼。正常邏輯代碼和異常處理代碼混合在一起,導致代碼迅速膨脹,難以維護。


參考資料:

  • C++深度解析教程
  • 總結

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

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