2009-06-30 2 views
9

Ich habe einige seltsame Fehler mit response.redirect() und das Projekt wurde überhaupt nicht .. bauen, wenn ich die Try-Catch-Blockentfernt, die den Codeblock umgeben wurde, wo Response.Redirect() war in es normalerweise gearbeitet ..Gibt es etwas, das verhindert, dass Response.Redirect im try-catch-Block funktioniert?

Will nur wissen, ob dies ein bekanntes Problem oder etwas ist ...

+2

Können Sie den Code veröffentlichen, der nicht erstellt werden würde? –

+0

@Fredrik: Ich stimme den meisten Antworten hier kann nur raten, was passiert ist. Die fortgesetzte Wirkung einer Thread-Vortex-Empfindung kann in Beziehung stehen, aber es ist schwierig, sie ohne den tatsächlich aufgetretenen Fehler und den gleichen Beispielcode zu sagen. – AnthonyWJones

+1

Sein Code kompiliert nicht, warum reden wir über das Werfen und Erfassen von ThreadAbortException? –

Antwort

23

Wenn ich mich richtig erinnere, löst Response.Redirect() eine Ausnahme zum Abbrechen der aktuellen Anfrage (ThreadAbortedException oder so ähnlich). Sie könnten also diese Ausnahme fangen.

Edit:

Dieses KB article beschreibt dieses Verhalten (auch für die Request.End() und Server.Transfer() Methoden).

Für Response.Redirect() gibt es eine Überlastung:

Response.Redirect(String url, bool endResponse) 

Wenn Sie endResponse=false passieren, dann wird die Ausnahme nicht ausgelöst (aber die Laufzeit wird auch weiterhin die aktuelle Anfrage ist).

Wenn endResponse=true (oder die andere Überladung verwendet wird), wird die Ausnahme ausgelöst und die aktuelle Anforderung wird sofort beendet.

+0

+1. Beachten Sie, dass die Verwendung von "Redirect", das nicht geworfen wird, die Ausführung der Anforderung (oder zumindest Funktionen auf dem aktuellen Stapel) fortsetzt, was interessante Nebenwirkungen haben kann (d. H. Persistente Informationen oder Protokollierung, die nicht ausgeführt würden, wenn eine Ausnahme ausgelöst wird).Es muss darauf geachtet werden, dass nach absichtlicher Weiterleitung kein nicht-trivialer Code ausgeführt wird. –

+0

das hat super funktioniert für mich Ausgezeichnete Antwort! – Kaos

4

Wie Martin darauf hinweist, löst Response.Redirect eine ThreadAbortException aus. Die Lösung ist wieder zu werfen die Ausnahme:

try 
{ 
    Response.Redirect(...); 
} 
catch(ThreadAbortException) 
{ 
    throw; // EDIT: apparently this is not required :-) 
} 
catch(Exception e) 
{ 
    // Catch other exceptions 
} 
+1

Sie müssen die ThreadAbortException nicht erneut werfen. Die Laufzeit wird sie am Ende des Catch-Blocks automatisch wieder auferstehen lassen. Siehe den Abschnitt Anmerkungen von http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx – LukeH

+0

Es gibt keine Notwendigkeit, diese Ausnahme erneut zu lösen, nachdem jeder Versuch catch Block diese Ausnahme behandelt hat, die Ausnahme wird sowieso von der CLR wieder aufgetaut. Sie können dies nur stoppen, indem Sie Thread.ResetAbort() aufrufen, aber ich würde es nicht empfehlen. – AnthonyWJones

+0

Ok :-) Aber Sie müssen die ThreadAbortException noch separat abfangen (oder den Typ der Ausnahme manuell überprüfen) –

3

Martin ist richtig, ein Threadabort geworfen wird, wenn Sie einen Response.Redirect verwenden, finden Sie in der kb article here

-3

Ich glaube nicht, dass es irgendein bekanntes Problem Hier.

Sie können eine Redirect() innerhalb eines try/catch-Blocks einfach nicht ausführen, da Redirect das aktuelle Steuerelement in einer anderen .aspx (zum Beispiel) belässt, wodurch der Catch in der Luft bleibt (kann nicht zurückkommen)).

EDIT: Auf der anderen Seite könnte ich all dies rückwärts abgebildet haben. Es tut uns leid.

+1

Das ist nicht korrekt. Beim Aufrufen von Response.Redirect() wird eine ThreadAbortException ausgelöst, die abgefangen werden kann. –

+0

Ja, vergessen zu denken, während ich tippte :), meine Entschuldigung. – tzup

0

Möglicherweise haben Sie auf eine Variable verwiesen, die im try-Block deklariert ist.

Zum Beispiel der folgende Code ist ungültig:

try 
{ 
    var b = bool.Parse("Yeah!"); 
} 
catch (Exception ex) 
{ 
    if (b) 
    { 
    Response.Redirect("somewhere else"); 
    } 
} 

Sie sollten außerhalb des Try-Catch-Blockes, um die b Erklärung ausrücken.

var b = false; 
try 
{ 
    b = bool.Parse("Yeah!"); 
} 
catch (Exception ex) 
{ 
    if (b) 
    { 
    Response.Redirect("somewhere else"); 
    } 
} 
Verwandte Themen