本例外處理系列為【實驗性質】,研究進行中...。
char *error_place 來記錄發生錯誤的位置。back 巨集來判斷及返回發生錯誤的位置。try 巨集增加了 back_ex 參數,作為 back 巨集使用的返回點。catch 巨集使用的形式,更類似真正的 catch ,執行的代碼不再需要放在 catch 的括弧裏。try 必須獨立對應一個 catch 的問題,現在一個 catch 可對應多個 try 。char *error_place;
#define back(back_ex) if(!strcmp(error_place, #back_ex)) goto back_ex
#define try(function , ex_name, back_ex) \
\
if(function == -1){\
	error_place = #back_ex; \
	goto ex_name;\
}\
back_ex: \
#define catch(ex_name) \
\
return 0; \
ex_name: 
int can_not_be_negative(double input) {
	return input < 0 ? -1 : 0;
}
int my_sqrt(double *output, double input) {
	throw(can_not_be_negative(input));
	*output = sqrt(input);
	return 0;
}
int main() {
	double get_output;
	try(my_sqrt(&get_output, -10), ex_can_not_be_negative, ex1);
	try(my_sqrt(&get_output, -20), ex_can_not_be_negative, ex2);
	try(my_sqrt(&get_output, -30), anthor_ex;, ex3);
	/*... any things ...*/
	system("pause");
	catch (ex_can_not_be_negative) {
		printf("[ex_can_not_be_negative] exception is happened!\n");
		printf("Input can't no be negative.\n");
	}
	back(ex1); back(ex2);
	catch (anthor_ex) {
		printf("[anthor_ex] exception is happened!\n");
		printf("Input can't no be negative.\n");
	}
	back(ex3);
}
[ex_can_not_be_negative] exception is happened!
Input can't no be negative.
[ex_can_not_be_negative] exception is happened!
Input can't no be negative.
[anthor_ex] exception is happened!
Input can't no be negative.
Press any key to continue . . .
try 使用時的可讀性不高。try 有三個參數,使用方式繁複。catch 結束後須加上 back , back 需要對應、適合的返回點,
back ,使用方式繁複。![]()