C 異常傳遞

2021-09-01 03:10:39 字數 1310 閱讀 6310

無論寫什麼方面的程式,異常是不可避免的,而怎麼處理涉及的東西則比較多,異常的處理方式,自己的理解分為兩個方面的,一種是正常的業務異常,例如銀行轉帳時金額不夠,這類錯誤一般會直接提示給使用者;另一種是系統內部錯誤,例如銀行轉帳時,網路中斷,這類錯誤同樣也是需要提示給使用者,但也是提示系統錯誤而已,不屬於業務異常;無論那種錯誤,基本都會涉及到異常的捕捉處理和日誌記錄.現在的系統多屬於分層的元件結構,異常更多的是在不同的元件之間傳遞,所以異常的捕捉和傳遞也相當重要,很少是由原始的異常傳送的地方處理異常.

.net的異常傳遞處理方式網上有很多規範可以使用,這裡不涉及處理異常的順序或者方式,主要對於異常的傳遞,典型的處理方式如下:

static void testexception1()

catch (exception ex)

}

雖然是同乙個異常,他會把異常資訊傳遞給上層,但是會丟失異常真正的堆疊資訊,他只會把異常的堆疊定義到當前丟擲異常的地方;所以如果需要把原始的異常的堆疊資訊拋給上層,則直接使用throw,而不需要任何特殊處理

static void testexception2()

catch//catch (exception)

}

這是網上推薦的做法,實際上,他的確可以把底層的異常堆疊和異常拋給外層,但是在測試的時候,因為自己的不小心,這種方式還是有個小問題,只是平時很容易忽略掉,如果異常的真實傳送地點正是在異常處理快裡面,而不是異常處理快裡面的函式裡面,他也會丟失堆疊資訊,這和throw ex處理方式沒啥分別,具體原因還有待考證.

測試源**

namespace exceptiondemo

static void test( action action)

catch (exception ex)

console.writeline();

}static void testexception1()

catch (exception ex)

}static void testexception2()

catch//catch (exception)

}static void testexception3()

catch

}static void testexception4()

catch (exception ex)

}static void dividezero()}}

本地的輸出,使用的是vs2008,.net3.5

從上圖的紅色標記可以看到,即是使用throw,對於**塊裡面直接丟擲的異常,他一樣會丟失相應的堆疊資訊.這樣看,還是包裝一層要安全一點,但是具體原因還不是特別清楚.

異常與引數傳遞

把乙個物件傳遞給函式或乙個物件呼叫乙個虛函式與把乙個物件作為異常丟擲 之間的區別 第一,異常物件在傳遞時總是被進行拷貝 當通過傳值方式捕獲時,異常物件被拷貝兩次,物件作為引數傳遞給函式時不一定需要拷貝。第二,物件作為異常丟擲與作為引數傳遞給函式相比,前者型別轉換比後者少 前者只有兩種轉換形式 最後一...

C 值傳遞 指標傳遞和引用傳遞(C )

一 基本介紹 1 值傳遞 形參是實參的副本 複製 拷貝 形參值的改變不會影響實參的值,這種方式用的最多。2 指標傳遞 形參是指標型別,形參作指標運算後指向的就是實參,所以會影響實參的值,這種方式用的也很多。引數。這種方式用的也蠻多的。引用只是乙個別名 二 示例 1 值傳遞 1 include voi...

python異常(概念 捕獲 傳遞 丟擲)

01.異常的概念 程式在執行時,如果python 直譯器遇到到乙個錯誤,會停止程式的執行,並且提示一些錯誤資訊,這就是異常 程式停止執行並且提示錯誤資訊這個動作,我們通常稱之為 丟擲 raise 異常 程式開發時,很難將所有的特殊情況都處理的面面俱到,通過異常捕獲可以針對突發事件做集中的處理,從而保...