2010-08-26 6 views
7

Il codice:Quali eccezioni potrebbe stringa = stringa oltre a System.OutOfMemoryException?

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

penso che la persona che ha programmato questo è stato "solo facendo attenzione," ma per interesse quali eccezioni potrebbero essere gettati su una linea che fa un assegnazione delle stringhe come questo qui? Posso pensare a System.OutOfMemoryException, ma quali altri?

Grazie

+2

mConnection_String ha un setter che potrebbe generare un'eccezione? (So ​​che la convenzione di denominazione di mConnection_String non suggerisce che sia così) – Brandon

+2

Forse il 'try' 'catch' è un residuo del codice originale (dove forse ha provato a testare la connessione) – Nissim

+0

Immagino che tu non possa anche ottenere OutOfMemoryException qui. La variabile membro è già assegnata, l'assegnazione scrive solo il riferimento a quella variabile. –

risposta

3

Herb Sutter scrivere diversi grandi articoli su sicurezza rispetto alle eccezioni, e in one of them mostra 3 tipi di sicurezza rispetto alle eccezioni:

  1. la garanzia di base

  2. la garanzia forte garanzia

  3. il nothrow

Questi principi sono comunemente noti nel mondo C++ ma potremmo usarli anche in .net world perché uno di questi si verifica nella tua situazione.

Se mConnection_String è un campo di tipo System.String (o un altro tipo di riferimento) che sicuramente sa, che questo codice è "nothrow garanzia", ​​perché semplice assegnazione per il tipo di riferimento non poteva generare eccezioni a tutti .

+0

Grazie per la risposta e il link informativo Sergey. – AndrewJacksonZA

2

Un OutOfMemoryException non è molto probabile che accada qui, perché la stringa è non copiato e nessuna nuova memoria deve essere allocata.

2

Nessuno a cui possa pensare. Nemmeno un'eccezione di memoria esaurita. Le stringhe sono memorizzate in un string pool. Se si ha la stessa stringa due volte nel programma, entrambi fanno riferimento alla stessa istanza di stringa nel pool di stringhe.

Vedere anche la documentazione per String.Intern().

EDIT: Come sottolineato in un commento, la piscina stringa è irrilevante dal momento che questo è semplicemente un incarico di riferimento (ma alcune informazioni su di esso è utile comunque, anche se non ha nulla a che fare con la domanda, mi spiace quella). Entrambe le variabili puntano allo stesso identico oggetto in memoria dopo l'assegnazione e non viene rivendicata alcuna nuova memoria.

+0

No, questo è vero solo per i valori letterali stringa, ovvero espressioni di stringa costante nel codice o stringhe internamente esplicitate. 'string s1 =" Hello ";' e 'string s2 =" Hell "+ 'o';' sono in realtà diversi oggetti stringa e 'object.ReferenceEquals (s1, s2)' restituirà false sebbene entrambe le stringhe siano uguali. –

+2

Il pool di stringhe è irrilevante qui. È semplicemente una copia di riferimento. In seguito, mConnection_String e vConnection_String puntano allo stesso oggetto. Se vConnection_String viene modificato, viene assegnata una nuova memoria ... –

+0

Hai assolutamente ragione. Aggiornerò la mia risposta ... Grazie. –

3

Nulla può succedere qui dal mio punto di vista. Se si utilizza qualcosa come subversion, probabilmente si vedrà che qualcuno ha rimosso del codice qui senza rimuovere la gestione delle eccezioni. Altrimenti è semplicemente sciocco.

È possibile rimuovere il codice dettagliato senza dubbi.

3

Non riesco a vedere come ciò possa generare alcuna esecuzione. Immagino che il programmatore abbia semplicemente un temperamento che usa:

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

... ThreadAbortException? (Ma verrà nuovamente generato dopo il blocco catch.)

+0

Non necessariamente: per quanto ne sappiamo ** ExceptionHandler ** potrebbe resettare l'interruzione di thread! (Sì, è un tratto.) –

+0

@Paul: buon punto - anche questa è una possibilità. –

0

Le eccezioni generate dipendono da ciò che è mConnection_String.

Se mConnection_String è un campo , è molto improbabile che venga generata alcuna eccezione. La logica Try..Catch è probabilmente proprio lì come codice standard della piastra della caldaia in modo che quando il codice viene aggiunto in seguito, è nel blocco try ... catch.

Se mConnection_String è una proprietà , quindi può generare qualsiasi eccezione che può essere generata (e non rilevata) nella proprietà set. Dovresti cercare nella proprietà set per vedere cosa è possibile.