Ci sono più domande (1, 2, 3, 4 ecc. Ecc.) Chiamato "Perché questa eccezione non viene catturata". Purtroppo, nessuna di queste soluzioni funziona per me ... Quindi sono bloccato da un'eccezione davvero inafferrabile.Moby Dick delle eccezioni
Ho un pezzo di codice (.NET 4.0) che controlla un file di testo di grandi dimensioni per cifre e numeri. Mentre i test ho ricevuto un'eccezione di runtime:
Quello che vedete qui è un modello di try-catch con un catchblock per un ArgumentOutOfRangeException. Ma durante il runtime, il blocco try lancia una ArgumentOutOfRangeException che non viene catturata.
Ho letto la sezione C# language specification sulla struttura try-catch, e dice:
un blocco catch di un'istruzione try è raggiungibile se l'istruzione try è raggiungibile.
Quindi in teoria il codice di cui sopra dovrebbe catturare l'eccezione.
Quindi ho pensato che potrebbe avere qualcosa a che fare con il fatto che questo codice è in esecuzione in un compito (durante l'elaborazione del file di testo voglio anche aggiornare l'interfaccia utente in modo da farlo asincrono). Ho cercato in giro e poi ho trovato risposta this da Jon Skeet. Sostanzialmente suggerisco di usare Task.Wait in un blocco try-catch per rilevare eventuali eccezioni.
Il problema che sto affrontando ora è che non posso davvero chiamare Task.Attendere perché ciò bloccherebbe il thread chiamante che è il mio thread dell'interfaccia utente! Poi ho pensato che avrei potuto creare un tasklayer in più per aspettare per questo compito:
//Code called from the UI
System.Threading.Tasks.Task.Factory.StartNew(()=>
{
//Create a new task and use this task to catch any exceptions
System.Threading.Tasks.Task task = System.Threading.Tasks.Task.Factory.StartNew(MethodWithException);
try
{
task.Wait();
}
catch(Exception)
{
MessageBox.Show("Caught it!");
}
});
Ma questo dà ancora lo stesso risultato ... Poi ho pensato che potrebbe essere a causa del fatto che io non sono abbastanza con particolare il mio Exceptiontype. Ma gli stati di specifica linguaggio C#:
Alcuni linguaggi di programmazione possono supportare eccezioni che non sono rappresentabili come un oggetto derivato da System.Exception, sebbene tali eccezioni non potrebbero mai essere generate dal codice C#.
Quindi, a meno che non si utilizzi qualche API di terze parti abbozzata, si è sempre a posto quando si utilizza Exception
. Quindi mi sono trovato con una risposta suggerita da Jon Skeet che non ha funzionato per me. In quel momento sapevo che avrei dovuto smettere di provare ...
Quindi qualcuno sa cosa sta succedendo? E come posso risolvere questo? So che potrei semplicemente controllare seè uguale o superiore a text.Length
ma capire cosa sta succedendo è più importante del codice di lavoro.
È anche senza un corpo di presa? –
Sei sicuro al 100% che quell'eccezione non sia gestita? È possibile che tu abbia appena impostato l'opzione per interrompere eventuali eccezioni in Visual Studio? – Andrey
Hai provato a eseguire il tuo programma al di fuori dell'IDE VS? – Steve