通常情況,不使用goto語句的情況下,函式會返回到他被呼叫的位置。但是使用可以使乙個函式直接跳轉到另一函式,不需要返回。
中最重要的內容是setjmp巨集和longjmp函式。——
setjmp巨集「標記」程式的乙個位置;longjmp函式可以跳轉到之前所標記的位置。
該強大的機制主要運用在錯誤處理之中。
(1)呼叫setjmp巨集的引數是乙個jmp_buf(在中宣告)型別的變數。setjmp巨集會將當前的 環境 儲存到該變數以便longjmp函式呼叫時使用,然後返回0。
呼叫格式: int setjmp(jmp_buf env);
(2)呼叫longjmp函式的引數是和setjmp使用同一jup_buf型別的變數(用該變數內容來恢復當前環境)然後從setjmp巨集呼叫中返回值val(longjmp函式的第二個引數)。
呼叫格式: void longjmp(jmp_buf env,int val);
總而言之,setjmp在第一次呼叫時返回0,隨後longjmp函式呼叫後將控制權重新轉給setjmp巨集,這次呼叫的
setjmp會
返回乙個非零值。
//測試setjmp的longjmp
#include
#include
jmp_buf env;
void f1(void);
void f2(void);
int main(void)
f1();
printf("program terminates normally\n");
getch();
return 0;
}void f1(void)
void f2(void)
結果如圖所示:
可知,setjmp巨集最初返回0,main會呼叫f1,接著f1呼叫f2,f2使用longjmp將控制權重新轉給main函式,
而不是返回
到f1.當longjmp函式執行時,控制權重新回到setjmp巨集呼叫,這一次setjmp巨集返回1。
c之錯誤處理
c 語言不提供對錯誤處理的直接支援,但是作為一種系統程式語言,它以返回值的形式允許您訪問底層資料。在發生錯誤時,大多數的 c 或 unix 函式呼叫返回 1 或 null,同時會設定乙個錯誤 errno,該錯誤 是全域性變數,表示在函式呼叫期間發生了錯誤。您可以在 標頭檔案中找到各種各樣的錯誤 所以...
Zend Framework學習 之錯誤處理
只在提交表單的時候出問題呢?我一步步跟蹤查詢問題的出處,最後竟然發現是在寫入資料庫的時候出了問題.對於我這個zend 新手來說,寫入資料庫的時候出現找不到控制器的問題,兩相不相干的問題,那真是難上加難,無耐之下,我把裡面擴張的類全部用教程裡的原始碼替換,看看是不是自己有些地方寫錯,沒想,替換以後還是...
Unity學習(C ) 錯誤處理(異常處理)
try catch catch finally static void main string args int num1 23 console.writeline array 5 catch nullreferenceexception e 依然報錯,因為捕捉的異常型別不對 catch index...