2013-07-02 14 views
6

Di ', ho un blocco try/catch che incapsula un grande blocco di codice e poi da qualche parte in esso ho bisogno di chiamare Response.Redirect in quanto tale:Response.Redirect eccezione all'interno del blocco try/catch

protected void ButtonGo_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     using(lockingMethod) 
     { 
      //Code... 

      //Somewhere nested in the logic 
      Response.Redirect(strMyNewURL); 

      //More code... 
     } 
    } 
    catch(Exception ex) 
    { 
     LogExceptionAsError(ex); 
    } 
} 

Quello che succede in questo caso è che Response.Redirect genera un'eccezione, qualcosa sul terminare il thread, che credo sia un "normale flusso di eventi" per quel metodo, ma viene registrato come errore nel mio LogExceptionAsError. Quindi ero curioso, c'è un modo per rendere Response.Redirect non generare un'eccezione?

+0

qual è il valore di strMyNewUrl ?? –

+3

possibile duplicato di [C'è qualcosa che impedisce a Response.Redirect di funzionare all'interno del blocco try-catch?] (Http://stackoverflow.com/questions/1063625/is-there-something-that-prevents-response-redirect-to -work-inside-try-catch-bloc) –

+0

@AmitSingh: qualche altra pagina nel mio progetto. Non sono sicuro del perché ne hai bisogno? – c00000fd

risposta

4

Prova con la versione alternativa di Response.Redirect

Response.Redirect(strMyNewURL, false); 

Si terminerà il caricamento della pagina corrente.

+0

Evidentemente anche "catch (ThreadAbortException)" lo cattura. Non sono ancora chiaro su come gestirlo? – c00000fd

+0

@ c00000fd: Non ne sono sicuro :( – sarwar026

+1

OK, ho appena eseguito un debugger.The 'ThreadAbortException' è effettivamente catturato quando viene elaborato' Response.Redirect'. Quindi se il gestore viene lasciato vuoto, il CLR – c00000fd

2

Response.Redirect esegue la chiusura dell'esecuzione corrente e quindi il reindirizzamento immediato mediante il lancio di questa eccezione tale da non essere gestito. Questo è intenzionale e di design. Non dovresti prenderlo da solo nella maggior parte dei casi - sconfigge lo scopo. Se si desidera completare l'esecuzione il codice prima reindirizzamento, è possibile utilizzare l'overload:

Response.Redirect(somewhere, false); 

che non solleverà l'eccezione. Questo potrebbe essere inefficiente a meno che non sia necessario fare qualcos'altro prima di reindirizzare.

Si noti che questo è generalmente un flusso logico di controllo anti-pattern tramite l'eccezione di lancio e cattura ... Tuttavia ha senso che questo particolare metodo lo faccia poiché un reindirizzamento di solito non richiede ulteriori logiche da eseguire - risponde solo con un 302 e il nuovo indirizzo per andare a.

+1

Ottima spiegazione! Devo dire, però, che il mio insegnante di programmazione 101 mi avrebbe deluso se avessi usato questa "tecnica" di recupero ... Le eccezioni hanno lo scopo di contrassegnare le cose cattive, non come un modo semplice per "lasciar perdere" tutto e lasciare la stanza ". Bad Microsoft. – cockypup

Problemi correlati