try-catchブロック内で動作するようにResponse.Redirectをしないように何かがありますか?
-
21-08-2019 - |
質問
私はresponse.redirect()
でいくつかの奇妙なエラーを持って、私はResponse.Redirect()
はそれで正常に働いていたコードのブロックを囲むたのtry-catch のブロックを削除したときにプロジェクトが...すべてで構築されませんでした..
ただ、これは既知の問題か何かであるかどうかを知りたい...
解決
、Response.Redirect()
は、現在のリクエスト(ThreadAbortedException
またはそのような何かを)中止する例外をスローします。だから、その例外をキャッチされる可能性があります。
編集ます:
KBの記事のrel="noreferrer">これはRequest.End()とServer.Transfer()
方法についても)この動作を説明します。
Response.Redirect()
のために過負荷が存在します:
Response.Redirect(String url, bool endResponse)
あなたがendResponse=false
を渡すと、、例外がスローされていません(ただし、ランタイムは、現在の要求の処理を続行します)。
endResponse=true
場合(または他の過負荷が使用されている場合)、例外がスローされ、現在の要求を直ちに終了されます。
他のヒント
マーティンが指摘するように、のResponse.RedirectはThreadAbortExceptionのをスローします。解決策は、例外を再スローすることです。
try
{
Response.Redirect(...);
}
catch(ThreadAbortException)
{
throw; // EDIT: apparently this is not required :-)
}
catch(Exception e)
{
// Catch other exceptions
}
マーティンはあなたがのResponse.Redirectを使用する場合、ここで KB記事を参照してThreadAbortExceptionのがスローされます、正しいですの
あなたは、tryブロック内で宣言された変数を参照している可能性があります。
例えば、以下のコードが無効である
try
{
var b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
if (b)
{
Response.Redirect("somewhere else");
}
}
あなたは、try-catchブロックの外側にBの宣言を移動する必要があります。
var b = false;
try
{
b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
if (b)
{
Response.Redirect("somewhere else");
}
}
私はここに任意の既知の問題があるとは思いません。
リダイレクトが空気中にキャッチを離れる(例えば)別の.aspxの、(それに戻って来ることができない)に現在のコントロールを離れるので、あなたは、単にtry / catchブロック内でリダイレクトを()で行うことはできません。
EDIT:一方で、私はこのすべてを持っていたかもしれない後方考え出し。申し訳ありません。