一、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.

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.

value
Value to be returned to setjmp call.
分析一下,首先setjump設定成功傳回0,執行Divide函數,除數為0,longjump跳回到setjump處,傳回參數1,故繼續輸出
divisiong by zero, setjump和longjump 已經是c++異常的雛形,即使Divide函數本身沒有調用longjump,而是調用了某個函數,在這個函數内longjump,也可以跳轉到setjump 處,這樣就不用通過一層層的函數傳回值來判斷錯誤。
C語言的出錯處理被認為是緊耦合的,函數的使用者必須在非常靠近函數調用的地方編寫錯誤處理代碼,這會使得其變得笨拙以及難以使用。
二、C++異常處理方法(throw, try, catch)
錯誤處理代碼的編寫不再冗長乏味,并且不再與“正常”代碼混在一起。程式員可以将注意力集中于正常流程,然後在某個區域裡編寫異常處理代碼。如果多次調用同一個函數,隻需在一個地方編寫一次錯誤處理代碼。
錯誤不能被忽略。
即無論在多遠throw,都可以被catch到,但需要注意的是類型需要比對,下面的文章将讨論抛出自定義類型的異常。
參考:
C++ primer 第四版
Effective C++ 3rd
C++程式設計規範