나는 response.redirect()
와 함께 몇 가지 이상한 오류가 발생했습니다 내가 정상적으로 작동에 Response.Redirect()
했다 코드 블록을 둘러싼 된 시도 - 캐치 블록을 제거 할 때이 프로젝트는 .. .. 전혀 구축되지 않은Response.Redirect가 try-catch 블록 내에서 작동하지 못하도록하는 무언가가 있습니까?
그냥 알려진 문제인지 알고 싶다면 ...
나는 response.redirect()
와 함께 몇 가지 이상한 오류가 발생했습니다 내가 정상적으로 작동에 Response.Redirect()
했다 코드 블록을 둘러싼 된 시도 - 캐치 블록을 제거 할 때이 프로젝트는 .. .. 전혀 구축되지 않은Response.Redirect가 try-catch 블록 내에서 작동하지 못하도록하는 무언가가 있습니까?
그냥 알려진 문제인지 알고 싶다면 ...
정확하게 기억하면 Response.Redirect()
은 현재 요청을 중단하는 예외 (ThreadAbortedException
또는 그와 비슷한 것)를 발생시킵니다. 그래서 당신은 그 예외를 잡을 수 있습니다.
편집 :
이 KB article은 (또한 Request.End()
및 Server.Transfer()
메소드)이 동작을 설명합니다. 당신이 endResponse=false
을 통과 한 후 예외가 발생하지 않습니다 (그러나 런타임은 현재 요청을 처리하는 것) 경우
Response.Redirect(String url, bool endResponse)
:
는 Response.Redirect()
를 들어 과부하가 존재한다.
endResponse=true
(또는 다른 오버로드가 사용되는 경우) 예외가 발생하고 현재 요청이 즉시 종료됩니다.
+1. 던지지 않는'Redirect '를 사용하면 흥미로운 부작용 (즉, 예외가 발생할 경우 실행되지 않는 정보 또는 로깅)이 필요할 수있는 요청 (또는 현재 스택의 기능)을 계속 실행합니다.의도적 인 리디렉션 후에 중요한 코드를 실행하지 않도록주의해야합니다. –
이것은 나를 위해 훌륭했습니다. 훌륭한 대답! – Kaos
Martin이 지적한대로 Response.Redirect는 ThreadAbortException을 발생시킵니다. 알려진 문제가
try
{
Response.Redirect(...);
}
catch(ThreadAbortException)
{
throw; // EDIT: apparently this is not required :-)
}
catch(Exception e)
{
// Catch other exceptions
}
실제로 ThreadAbortException을 다시 throw 할 필요는 없습니다. 런타임은 자동으로 catch 블록의 끝에서 자동으로 부활시킵니다. http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx 비고 섹션을 참조하십시오. – LukeH
각 try catch 블록이이 예외를 처리 한 후에이 예외를 다시 throw 할 필요는 없습니다. 예외 어쨌든 CLR에 의해 재 승진됩니다. Thread.ResetAbort()를 호출함으로써 만 멈출 수는 있지만 권장하지는 않습니다. – AnthonyWJones
Ok :-)하지만 여전히 ThreadAbortException을 개별적으로 catch해야합니다 (또는 예외 유형을 수동으로 확인해야합니다) –
마틴은 ThreadAbortException이가 당신이 Response.Redirect를 사용할 때, 내가 생각하지 않는 kb article here
를 참조 던져 도착, 올바른 :이 솔루션은 예외를 다시 던질 것입니다 이리.
리디렉션은 현재 컨트롤을 다른 .aspx (예 : 현재)에 남겨두기 때문에 try/catch 블록 내에서 Redirect()를 수행 할 수 없습니다.).
EDIT : 다른 한편으로, 나는이 모든 것을 거꾸로 생각했을 것입니다. 죄송합니다.
그건 맞지 않아. Response.Redirect()를 호출하면 ThreadAbortException이 throw되어 catch 될 수 있습니다. –
네, 입력하는 동안 생각 깜빡 :), 내 사과. – tzup
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");
}
}
빌드하지 않을 코드를 게시 할 수 있습니까? –
@Fredrik : 나는 여기에서 대부분의 해답이 일어나는 일을 추측 할 수 있다고 동의합니다. threadabortexception의 계속 된 동작은 관련 될 수 있지만 실제로 발생한 오류 및 동일한 예제 코드 없이는 말하기가 어렵습니다. – AnthonyWJones
코드가 컴파일되지 않습니다. ThreadAbortException을 던지고 잡는 것에 대해 이야기하는 이유는 무엇입니까? –