2015-09-15 16 views
5
static void Main(string[] args) 
{ 
    try 
    { 
     Console.WriteLine("No Error"); 
    } 
    catch (DataException) /*why no compilation error in this line?*/ 
    { 
     Console.WriteLine("Error...."); 
    } 
    Console.ReadKey(); 
} 

Il codice è in fase di compilazione senza errori. Non capisco il motivo per cui la prima riga del blocco catch non sta dando alcun errore di compilazione -C# catch (DataException) - nessuna variabile definita

catch (DataException)

parametro DataException del blocco catch è una classe, e dovrebbe avere una variabile successiva ad essa come ad esempio -

catch (DataException d)

qualcuno può spiegare il comportamento di cui sopra?

+1

Questa è una sintassi valida per quando si cura solo quale tipo di eccezione si è verificata, ma non è necessario uno stack-trace, ecc. – Blorgbeard

+0

Nel caso in cui non sia necessario il 'd' – Eric

risposta

5

Nella sezione 8.10 del C# 5.0 spec, troverete la definizione sintassi per try/catch (scuse per la formattazione):

catch-clausole:
        specifiche clausole-catch-              generale -catch-clausola opt
        clausole di cattura specifiche opt     general-catch-clausola
specifiche-catch-clausole:
        specifica-catch-clausola
        specifiche-catch-clausole         specifica-catch-clausola
clausola di cattura specifica:
        catch         (         classe di tipo         identificatore opt         )         blocco
general-catch-clausola:
        catch         blocco

Così si può vedere che catch { }, catch (Exception) { } e catch (Exception ex) { } sono tutti validi in base alle specifiche.

Se non si specifica l'identificatore opzionale nel blocco catch, non si è in grado di accedere ai dettagli di eccezione, ma a volte non è necessario, quindi è bene non dichiarare una variabile che non si vuole t intenzione di accedere.

2

Perché catch non è un metodo. non hai bisogno di un parametro accanto al tipo. senza parametro e solo con tipo, l'eccezione di quel particolare tipo verrà gestita con quel blocco catch ma i dettagli vengono ignorati.

catch (DataException) consente di conoscere il tipo di eccezione, ma non è possibile ottenere i dettagli.

ad esempio, ho scritto un'eccezione personalizzata e ho sovrascritto Message per formattare il mio messaggio. con catch (ExceptionType), non è possibile accedere message.with catch (ExceptionType d), è possibile accedere con d.Message

2

Il modo in cui è stata attualmente scritta vuol dire che si sta dicendo al compilatore che quando verrà generata un'eccezione di tipo DataException, questo blocco catch deve essere processato E con il modo in cui lo hai scritto, non avrai alcuna variabile con l'eccezione memorizzata per poter accedere in seguito.

In genere una singola riga di codice (nemmeno un blocco di righe) può generare più tipi di Eccezione. Si desidera un'elaborazione diversa per ciascun tipo di eccezione.

Problemi correlati