2009-06-30 3 views
9

나는 response.redirect()와 함께 몇 가지 이상한 오류가 발생했습니다 내가 정상적으로 작동에 Response.Redirect()했다 코드 블록을 둘러싼 된 시도 - 캐치 블록을 제거 할 때이 프로젝트는 .. .. 전혀 구축되지 않은Response.Redirect가 try-catch 블록 내에서 작동하지 못하도록하는 무언가가 있습니까?

그냥 알려진 문제인지 알고 싶다면 ...

+2

빌드하지 않을 코드를 게시 할 수 있습니까? –

+0

@Fredrik : 나는 여기에서 대부분의 해답이 일어나는 일을 추측 할 수 있다고 동의합니다. threadabortexception의 계속 된 동작은 관련 될 수 있지만 실제로 발생한 오류 및 동일한 예제 코드 없이는 말하기가 어렵습니다. – AnthonyWJones

+1

코드가 컴파일되지 않습니다. ThreadAbortException을 던지고 잡는 것에 대해 이야기하는 이유는 무엇입니까? –

답변

23

정확하게 기억하면 Response.Redirect()은 현재 요청을 중단하는 예외 (ThreadAbortedException 또는 그와 비슷한 것)를 발생시킵니다. 그래서 당신은 그 예외를 잡을 수 있습니다.

편집 :

KB article

은 (또한 Request.End()Server.Transfer() 메소드)이 동작을 설명합니다. 당신이 endResponse=false을 통과 한 후 예외가 발생하지 않습니다 (그러나 런타임은 현재 요청을 처리하는 것) 경우

Response.Redirect(String url, bool endResponse) 

:

Response.Redirect()를 들어 과부하가 존재한다.

endResponse=true (또는 다른 오버로드가 사용되는 경우) 예외가 발생하고 현재 요청이 즉시 종료됩니다.

+0

+1. 던지지 않는'Redirect '를 사용하면 흥미로운 부작용 (즉, 예외가 발생할 경우 실행되지 않는 정보 또는 로깅)이 필요할 수있는 요청 (또는 현재 스택의 기능)을 계속 실행합니다.의도적 인 리디렉션 후에 중요한 코드를 실행하지 않도록주의해야합니다. –

+0

이것은 나를 위해 훌륭했습니다. 훌륭한 대답! – Kaos

4

Martin이 지적한대로 Response.Redirect는 ThreadAbortException을 발생시킵니다. 알려진 문제가

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

실제로 ThreadAbortException을 다시 throw 할 필요는 없습니다. 런타임은 자동으로 catch 블록의 끝에서 자동으로 부활시킵니다. http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx 비고 섹션을 참조하십시오. – LukeH

+0

각 try catch 블록이이 예외를 처리 한 후에이 예외를 다시 throw 할 필요는 없습니다. 예외 어쨌든 CLR에 의해 재 승진됩니다. Thread.ResetAbort()를 호출함으로써 만 멈출 수는 있지만 권장하지는 않습니다. – AnthonyWJones

+0

Ok :-)하지만 여전히 ThreadAbortException을 개별적으로 catch해야합니다 (또는 예외 유형을 수동으로 확인해야합니다) –

3

마틴은 ThreadAbortException이가 당신이 Response.Redirect를 사용할 때, 내가 생각하지 않는 kb article here

-3

를 참조 던져 도착, 올바른 :이 솔루션은 예외를 다시 던질 것입니다 이리.

리디렉션은 현재 컨트롤을 다른 .aspx (예 : 현재)에 남겨두기 때문에 try/catch 블록 내에서 Redirect()를 수행 할 수 없습니다.).

EDIT : 다른 한편으로, 나는이 모든 것을 거꾸로 생각했을 것입니다. 죄송합니다.

+1

그건 맞지 않아. Response.Redirect()를 호출하면 ThreadAbortException이 throw되어 catch 될 수 있습니다. –

+0

네, 입력하는 동안 생각 깜빡 :), 내 사과. – tzup

0

try 블록 내에서 선언 된 변수를 참조했을 수 있습니다.

예를 들어, 아래의 코드가 잘못되었습니다 :

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

당신은 시도 - catch 블록 외부에 B 선언을 이동해야합니다.

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