2010-07-29 28 views
8

Sto scrivendo un programma in C# e voglio rilevare le eccezioni causate dalla conversione di "" (null) in int. Qual è il nome dell'eccezione?C# - errore di analisi fallito?

EDIT: Non sono sicuro che posso mostrare qui il codice completo ... Ma sono sicuro che non è necessario il codice completo, quindi:

 int num1 = Int32.Parse(number1.Text); 
     int num2 = Int32.Parse(number2.Text); 
+0

Perché vorresti conoscere il nome dell'eccezione? Lo prenderai? (Spero di no ...) –

+9

Inoltre, nota che "" e null sono cose diverse. –

+0

Il controllo per false invece di gestire un'eccezione potrebbe essere un problema? –

risposta

27

Se è possibile evitarlo, non programmare per eccezioni!

Il nome di eccezione che si sta cercando si chiama FormatException.

Tuttavia, sarebbe più intelligente fare prima un TryParse sull'oggetto che si sta tentando di analizzare, ad es.

int value; 
if(!int.TryParse("1", out value)) 
{ 
    // You caught it without throwing an exception. 
} 
+1

Perché non "if (! String.IsNullOrEmpty (i))" prima? Seriamente, non vuoi nemmeno sostenere TryParse. Anche se lo fai mille volte e fallisci solo una volta, l'istruzione if prima di TryParse sarà più veloce. – DevinB

+5

@devinb: aggiungi due linee extra di codice solo per renderlo 10ms più veloce? Suona come micro-ottimizzazione inutile per me ... – Heinzi

+3

@George, sarebbe bello se avessi eseguito il backup di affermazioni come "Se puoi evitarlo, non codificare per eccezione" e "sarebbe più intelligente" con alcuni fatti freddi: -) – Saustrup

9

Come nota a margine, un modo semplice per scoprire l'eccezione è eseguirlo. Quando incontri l'errore, ti darà il nome dell'eccezione.

0

Quando si attiva l'eccezione, è possibile visualizzare il tipo. La cosa intelligente da fare è gestire il caso e mostrare un messaggio aggraziato all'utente, se possibile.

1

Dipende da cosa si sta utilizzando per eseguire la conversione. Ad esempio, int.Parse genererà ArgumentNullException, FormatException o OverflowException. Le probabilità sono che è ArgumentNullException che stai cercando, ma se è una stringa vuota piuttosto che un riferimento null, probabilmente sarà FormatException

0

Probabilmente stai cercando di ottenere un System.InvalidCastException, anche se penso che sarà dipendono come si tenta di eseguire la conversione.

Detto questo, non sarebbe più semplice/veloce scrivere semplicemente il codice e provare da solo? Soprattutto perché non hai specificato come eseguirai la conversione,.

0

Basta provarlo. Questo codice:

int.Parse(""); 

Genera un FormatException.

0

Le eccezioni sono costose. Dovresti usare int.TryParse. Restituirà il valore booleano falso se la conversione fallisce.

0

Convert.ToInt32 non genera un'eccezione di formato ("stringa di input non è nel formato corretto") su una stringa nulla. Puoi usarlo se è accettabile che il risultato sia uno 0 per una stringa nulla. (Vomita ancora sulla stringa vuota se)

 string s = null; 
     int i = Convert.ToInt32(s); 

Ma se ci si aspetta un numero di essere in scatola, si dovrebbe usare sia TryParse (come suggerito) o un Validator di qualche tipo per informare l'utente di cui hanno bisogno inserire un numero.

6

Diamo uno sguardo at the documentation (che è una soluzione molto più pulito che "provarlo"):

public static int Parse (string s)

[...]

Eccezioni:

  • ArgumentNullException: s è nullo.
  • FormatException: s non è nel formato corretto.

Questo dovrebbe rispondere alla tua domanda. Come altri hanno già menzionato, forse stai ponendo la domanda sbagliata e vuoi usare invece Int32.TryParse.

+0

+1 per il collegamento della documentazione. – Brian