2013-01-14 6 views
6

Ho il codice seguente:Il lancio di un'eccezione all'interno di un metodo causa la restituzione del metodo?

public static Point operator /(Point point, double value) 
    { 
     if (value == 0) 
     { 
      throw new DivideByZeroException("Cannot divide by zero"); 
      return Point.Origin; 
     } 
     return new Point(point.X/value, point.Y/value, point.Z/value); 
    } 

E la prima istruzione return (return Point.Origin;) è sottolineata in verde in Visual Studio. Il messaggio dice "Rilevato codice irraggiungibile" quando il cursore si trova sopra il testo sottolineato. Questo mi porta alla mia domanda indicata nella riga del titolo:

Il lancio di un'eccezione all'interno di un metodo causa la restituzione del metodo?

+1

Grazie, ho capito ora: Lanciare un'eccezione all'interno di un metodo fa sì che il flusso di esecuzione del programma passi a un gestore di eccezioni appropriato nel metodo, (come un'istruzione catch o finally) se ce n'è uno, o per uscire dal metodo e salire lo stack delle chiamate finché non viene gestito. In ogni caso, l'altro codice nel metodo dopo il 'lancio della nuova eccezione 'e all'esterno di eventuali blocchi catch/finally non verrà mai eseguito. E per chiarire e rispondere alla domanda, il metodo non restituisce un valore, ma "restituisce" nel senso che l'esecuzione del programma ritorna al metodo di chiamata. –

risposta

1

Il lancio di un'eccezione all'interno di un metodo causa la restituzione del metodo?

Sì. L'esecuzione di un metodo viene interrotta, quindi il metodo restituisce il flusso di esecuzione. Ma non viene restituito alcun valore, l'hai definito con la dichiarazione return. Nessuna riga dopo il throw new nel metodo corrente è in esecuzione, ad eccezione dei corrispondenti catch e finally blocchi. Quindi non devi restituire i valori dopo aver generato un'eccezione.

Visual Studio sottolinea i blocchi di codice che non è stato possibile rilevare. Nel tuo caso specifico l'istruzione return Point.Origin; non verrà mai eseguita, quindi puoi rimuoverla.

+0

È davvero un comportamento simile a "return"? Perché tecnicamente la funzione non restituisce un valore ma segnala un'eccezione. Ho sbagliato? – cheesemacfly

+0

Hai ragione. Stiamo parlando del ritorno del flusso di esecuzione, non dei valori restituiti. perché il metodo restituire può essere considerato come causa del ritorno del flusso di esecuzione o del valore di causa del ritorno: prima se vero, il secondo è falso. –

+0

@cheesemacfly - un'eccezione _aborts_ il metodo, rendendo il ritorno di un valore un non-problema. –

0

Sì, il lancio di un'eccezione causa il ritorno immediato del metodo.

Tuttavia, non è un ritorno normale. Ad esempio, non esiste un valore di ritorno. L'unico modo per acquisire il controllo da un metodo che viene restituito come risultato di un'eccezione generata, è di avere un gestore di eccezioni.

8

Bene, causa l'esecuzione del metodo su exit, sì. L'eccezione viene sollevata nello stack, con il metodo più vicino che la cattura. Se non influisse sul flusso di esecuzione, sarebbe praticamente inutile.

Questo non è lo stesso del metodo che restituisce "normalmente" - cioè senza eccezioni. Quindi supponiamo che il metodo chiamante ha avuto:

Point foo = bar/baz; 
Console.WriteLine("Done"); 

In questo caso la chiamata Console.WriteLine()non avrebbe eseguito se l'operatore di divisione ha generato un'eccezione. Invece, sia l'eccezione sarebbe stato catturato in questo metodo, o l'eccezione sarebbe propagarsi al chiamante che di metodo, ecc

(finally blocchi saranno eseguiti lungo la strada troppo.)

è probabilmente vale la pena leggere la guida MSDN a "handling and throwing exceptions".

1

Non esattamente. Quando viene lanciata un'eccezione, se viene catturata, passa al codice di gestione all'interno del metodo. Da lì può fare tutto ciò che desideri. Se non analizzato come nel tuo esempio, salterà al metodo che ha chiamato questo metodo e non "restituirà" mai un valore. Non ritornerà mai più per eseguire la linea di ritorno che hai dopo l'eccezione generata.

2

No, perché il lancio di un'eccezione è non un ritorno.

Se l'eccezione non viene gestita all'interno della funzione, causerà l'uscita immediata dalla funzione, passando il controllo al primo punto del programma in cui verrà rilevata l'eccezione, ovvero gestita. (Risultante in una morte improvvisa del programma che non viene gestita.)

Poiché la funzione uscirà dopo il lancio l'istruzione return è inutile in quanto non verrà mai raggiunto.,

Problemi correlati