2013-04-22 1 views
8

Fino ad ora, ogni volta che volevo mostrare un eccezione generata dal mio codice che ho usato:display Eccezione sulla clausola try-catch

try 
{ 
    // Code that may throw different exceptions 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.ToString());   
} 

ho usato il codice precedente principalmente per il debug motivi, al fine di vedere il tipo esatto di eccezione e il motivo corrispondente è stata generata l'eccezione.

In un progetto che sto creando ora, utilizzo diverse clausole try-catch e vorrei visualizzare un messaggio popup in caso di eccezione, per renderlo più "user friendly". Per "user friendly", intendo un messaggio che nasconde frasi come Null Reference Exception o Argomento Fuori intervallo Eccezione attualmente visualizzate con il codice precedente.

Tuttavia, desidero comunque visualizzare le informazioni rilevanti con il tipo di eccezione che ha creato il messaggio.

Esiste un modo per formattare l'output visualizzato delle eccezioni generate in base alle esigenze precedenti?

+0

È possibile visualizzare qualsiasi tipo di messaggio che si desidera, o reagire ad l'eccezione in qualsiasi numero di modi, sei in controllo una volta che hai preso l'eccezione. – devdigital

+0

Se hai intenzione di eseguire il debug, perché non utilizzare solo un debugger? Se si verificano eccezioni impreviste nell'utente finale, è sufficiente registrarlo e lasciare che il programma termini. –

+1

Meglio aggiungere un messaggio per ogni eccezione invece di solo 1..add più blocchi catch e aggiungere msgbox in ciascuno. non prendere l'eccezione direttamente – Amitd

risposta

8

È possibile utilizzare .Message, però io non consiglierei solo la cattura Exception direttamente. Provare a rilevare più eccezioni o dichiarare esplicitamente l'eccezione e adattare il messaggio di errore al tipo Eccezione.

try 
{ 
    // Operations 
} 
catch (ArgumentOutOfRangeException ex) 
{ 
    MessageBox.Show("The argument is out of range, please specify a valid argument"); 
} 

Facendo Exception è piuttosto generico e può essere considerata cattiva pratica, in quanto forse nascondere bug nell'applicazione.

È inoltre possibile controllare il tipo di eccezione e gestirlo di conseguenza controllando il tipo di eccezione:

try 
{ 

} 
catch (Exception e) 
{ 
    if (e is ArgumentOutOfRangeException) 
    { 
     MessageBox.Show("Argument is out of range"); 
    } 
    else if (e is FormatException) 
    { 
     MessageBox.Show("Format Exception"); 
    } 
    else 
    { 
     throw; 
    } 
} 

che mostrerebbe una finestra di messaggio per l'utente se l'eccezione è un ArgumentOutOfRange o FormatException, altrimenti si rigenerare l'eccezione (e mantenere la traccia dello stack originale).

+0

Hai dimenticato l'ultimo caso in cui dovrai" lanciare "l'eccezione di nuovo. –

+0

nel tuo secondo esempio, potresti usare 'throw;' per propagarlo ulteriormente nella catena di prova – Default

+0

quale problema di scrivere diverse clausole 'catch' con' ArgumentOutOfRangeException' e 'FormatException', invece di scrivere' if else'? dichiarazioni in un blocco 'catch' –

3

Exception.Message fornisce un messaggio più (ma non interamente) di facile utilizzo rispetto a Exception.ToString(). Considerate questo esempio inventato:

try 
{ 
    throw new InvalidOperationException(); 
} 
catch(InvalidOperationException ex) 
{ 
    Console.WriteLine(ex.ToString()); 
} 

Anche se Message produce un messaggio semplice rispetto ToString() il messaggio visualizzato non sarà ancora significherà molto per l'utente. Non ci vorrà molto sforzo per ingoiare manualmente le eccezioni e visualizzare un messaggio personalizzato per l'utente che li aiuterà a risolvere questo problema.

try 
{ 
    using (StreamReader reader = new StreamReader("fff")){} 
} 
catch(ArgumentException argumentEx) 
{ 
    Console.WriteLine("The path that you specified was invalid"); 
    Debug.Print(argumentEx.Message); 

} 
catch (FileNotFoundException fileNotFoundEx) 
{ 
    Console.WriteLine("The program could not find the specified path"); 
    Debug.Print(fileNotFoundEx.Message); 
} 

Si può anche utilizzare per Debug.Print testo di output alla finestra immediata o finestra di output (a seconda delle preferenze VS) a scopo di debug.

2

È possibile utilizzare la proprietà Exception.Message per ottenere un messaggio che descrive l'eccezione corrente.

catch (Exception ex) 
    { 
    MessageBox.Show(ex.Messagge());   
    } 
2
try 
    { 
     /////Code that may throws several types of Exceptions 
    }  
    catch (Exception ex) 
     { 
     MessageBox.Show(ex.Message);   
     } 

Usa sopra il codice.

può anche mostrare un messaggio di errore personalizzato come:

try 
    { 
     /////Code that may throws several types of Exceptions 
    }  
    catch (Exception ex) 
     { 
     MessageBox.Show("Custom Error Text "+ex.Message);   
     } 

aggiuntive:

Per differenza tra ex.ToString() e ex.Message seguire:

Exception.Message vs Exception.ToString()

Tutti i dettagli con esempio:

http://www.dotnetperls.com/exception

+0

'MessageBox.Show (ex.Message); ' – Arshad

+0

@Arshad per errore, grazie – Freelancer

2

provare questo codice:

 try 
     { 
     // Code that may throw different exceptions 
     } 
     catch (Exception exp) 
     { 
      MessageBox.Show(exp.Message());   
     }