2011-01-20 231 views
1

在C++中,我能夠拋出一個裸露的字符串作爲例外,但在C#中我必須拋出一個Exception。什麼是C#等同於在C++中拋出一個字符串?C++/C#異常拋出

例如,在C++中我可以throw "something bad happened"。在C#這將是.....?

+1

我可以試着回答這個問題,但那隻會引發一個字符串。 – 2011-01-20 00:40:19

+0

你的問題沒有任何意義 – Divi 2011-01-20 00:43:36

+0

你的意思是在C++中你可以做`拋出'這是一個錯誤「;`而且你希望C#等價。 – 2011-01-20 00:47:29

回答

6

這個問題很模糊,但我認爲問題是「在C++中可以拋出字符串;關於C#呢?」

在C#中,您以類似於您在C++中所做的方式拋出異常;主要區別在於C#中只能拋出派生自System.Exception的類,而在C++中可以拋出任何類型(儘管通常拋出僅派生自std::exception或來自其他異常基類的類;我不會拋出純字符串在C++中)。

請記住,在C#中不僅僅有System.Exception,但有描述的最常見原因引發異常的各種派生類的整車(ArgumentOutOfRangeExceptionInvalidOperationExceptionOverflowException,...只是說一些隨機),這給你一個更好的方式來表達問題的類型(用類型來表示,這可以在catch塊中區分出來),並且你仍然可以通過在自定義錯誤字符串中傳遞它來指定自定義錯誤字符串構造函數。這比扔一個字符串要好得多,因爲如果異常「冒泡」到最上面的catch或多或少只能記錄問題並退出,仍然可以捕獲一個通用的System.Exception並仍然顯示/記錄錯誤字符串。

請注意,這在C++中也是可能的,但現成的派生異常(在<stdexcept>中)遠遠小於.NET Framework提供的異常。在C++中,來自throw的堆棧展開會立即銷燬任何本地對象(構建RAII的概念),但在C#中,銷燬是非確定性的(可能會發生這種情況)在指出他們超出範圍的變量之後的任何時刻);因此在這種情況下必須立即實施IDisposable接口並使用using塊的課程非常重要。

1

C#只允許拋出從Exception類派生的對象。 CLR本身也允許拋出其他類型,所以如果你真的希望你能寫出直接拋出其他語言或IL的字符串的方法。您將無法將其作爲C#中的字符串異常捕獲它(僅作爲一個未知的異常,「catch」沒有異常類型)。

根據你的目標throw new Exception("My string here");可能就足夠了。 編輯(謝謝尼爾):但你應該創建自己的例外,除非是一次性扔掉實驗。