2010-08-26 93 views
7

代碼:什麼異常除了System.OutOfMemoryException之外,string = string throw?

public Constructor(string vConnection_String) 
    { 
    try 
    { 
     mConnection_String = vConnection_String; 
    } 
    catch (Exception ex) 
    { 
     ExceptionHandler.CatchEx(ex); 
    } 
    } 

我覺得誰編程這是人「只是要小心,」但出於興趣什麼異常可以在,做這樣一個這裏字符串賦值線被拋出?我可以想到System.OutOfMemoryException,但其他人呢?

謝謝

+2

mConnection_String是否有可能拋出異常的setter? (我知道mConnection_String的命名約定並不表示這種情況) – Brandon 2010-08-26 14:19:29

+2

也許'嘗試''catch'是原始代碼的剩餘部分(其中可能試圖測試連接) – Nissim 2010-08-26 14:19:32

+0

我想你不能甚至在這裏得到OutOfMemoryException。成員變量已分配,分配只寫入該變量的引用。 – 2010-08-26 14:26:07

回答

3

Herb Sutter寫異常安全的幾個偉大的文章,並在one of them他顯示3種異常安全:

  1. 的基本保證

  2. 有力保障

  3. 的拋出異常的保證

這個原則在C++世界中是衆所周知的,但我們也可以在.net世界中使用它們,因爲它們中的一個發生在你的情況中。

如果mConnection_String是System.String類型(或其他引用類型),比你一定知道,這個代碼爲「無拋出保證」的領域,因爲簡單的賦值爲參考不能在所有拋出異常。

+0

感謝您的回覆和信息鏈接謝爾蓋。 – AndrewJacksonZA 2010-08-27 06:47:14

2

OutOfMemoryException是不太可能發生在這裏,因爲字符串是不會複製並沒有新的內存需要進行分配。

2

沒有,我能想到的。甚至沒有內存不足的例外。字符串存儲在string pool中。如果您的程序中有兩次相同的字符串,則它們都會在字符串池中引用相同的字符串實例。

另請參閱String.Intern()的文檔。

編輯:正如評論指出的那樣,串池在這裏無關緊要,因爲這僅僅是一個參考分配(但關於它的一些信息是有用盡管如此,儘管它無關的問題,惋惜那)。在賦值之後,這兩個變量都會指向內存中完全相同的對象,並且不會聲明新的內存。

+0

不,這隻適用於字符串文字,即代碼中的常量字符串表達式或顯式實施的字符串。 'string s1 =「Hello」;'和'string s2 =「Hell」+'o';'實際上是不同的字符串對象,'object.ReferenceEquals(s1,s2)'將返回false,儘管兩個字符串都相等。 – 2010-08-26 14:24:14

+2

字符串池在這裏是無關緊要的。這只是一個參考副本。之後,mConnection_String&vConnection_String指向同一個對象。如果vConnection_String被改變,那麼它被分配新的內存... – 2010-08-26 14:24:31

+0

你是絕對正確的。我會更新我的答案......謝謝。 – 2010-08-26 14:27:49

3

在我看來,這裏什麼都不會發生。如果你使用類似subversion的東西,那麼你可能會看到有人在這裏刪除了一些代碼而沒有去除異常處理。否則,它只是愚蠢的。

您可以毫不懷疑地刪除冗長的代碼。

3

我看不出這會怎樣產生任何模糊感。我想程序員只是有一個ctor tempate他使用:

try 
{ 
    /// Put Ctor code here! 
} 
catch (Exception ex) 
{ 
    ExceptionHandler.CatchEx(ex); 
} 
1

... ThreadAbortException? (但它會在catch塊後再次拋出。)

+0

不一定:對於我們所知的所有** ExceptionHandler **可以重置線程中止! (是的,這是一個延伸。) – 2010-08-26 14:58:22

+0

@保羅:好點 - 這也是一種可能性。 – 2010-08-26 18:38:05

0

拋出的異常將取決於mConnection_String是什麼。

如果mConnection_String字段,則不太可能拋出任何異常。 Try..Catch邏輯可能只是作爲標準的鍋爐板代碼,因此當代碼稍後添加時,它就在try ... catch塊中。

如果mConnection_String屬性,那麼它可以拋出任何可以在set屬性中引發(而不是捕獲)的異常。您必須查看set屬性以查看可能的情況。

相關問題